Submitted URL: http://golem.de/
Effective URL: https://www.golem.de/
Submission: On November 27 via manual from CH

Summary

This website contacted 50 IPs in 6 countries across 32 domains to perform 222 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 73 77.247.84.129 25291 (SYSELEVEN...)
2 77.247.84.128 25291 (SYSELEVEN...)
6 2a00:13c8:f5:... 25291 (SYSELEVEN...)
8 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.103.64 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 2.18.232.233 16625 (AKAMAI-AS)
1 2600:9000:204... 16509 (AMAZON-02)
2 143.204.212.210 16509 (AMAZON-02)
8 2a00:1450:400... 15169 (GOOGLE)
16 23.211.10.211 16625 (AKAMAI-AS)
1 1 52.215.3.29 16509 (AMAZON-02)
2 52.17.26.15 16509 (AMAZON-02)
3 23.211.8.45 16625 (AKAMAI-AS)
1 89.163.159.112 24961 (MYLOC-AS)
1 2600:9000:204... 16509 (AMAZON-02)
3 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
14 172.217.23.162 15169 (GOOGLE)
1 52.94.216.48 16509 (AMAZON-02)
1 185.33.223.202 29990 (ASN-APPNEXUS)
1 178.250.0.93 44788 (ASN-CRITE...)
1 35.177.180.124 16509 (AMAZON-02)
1 4 54.194.108.5 16509 (AMAZON-02)
1 2600:9000:204... 16509 (AMAZON-02)
2 52.49.41.66 16509 (AMAZON-02)
1 1 66.117.28.86 15224 (OMNITURE)
17 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 165.227.149.77 14061 (DIGITALOC...)
1 2a00:1450:400... 15169 (GOOGLE)
1 172.82.228.19 15224 (OMNITURE)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 52.212.57.107 16509 (AMAZON-02)
1 85.114.144.194 24961 (MYLOC-AS)
1 2 89.163.159.116 24961 (MYLOC-AS)
1 1 2001:16e0:10a... 12611 (RKOM R-KO...)
2 2 85.114.159.93 24961 (MYLOC-AS)
1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 85.114.144.107 24961 (MYLOC-AS)
6 188.40.114.52 24940 (HETZNER-AS)
1 52.213.21.157 16509 (AMAZON-02)
2 52.216.164.213 16509 (AMAZON-02)
1 178.250.0.130 44788 (ASN-CRITE...)
3 143.204.214.67 16509 (AMAZON-02)
10 2a00:1450:400... 15169 (GOOGLE)
1 62.138.242.228 61157 (PLUSSERVE...)
1 2606:4700:30:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
3 136.243.65.40 24940 (HETZNER-AS)
1 2a00:1450:400... 15169 (GOOGLE)
222 50
Apex Domain
Subdomains
Transfer
95 golem.de
golem.de
www.golem.de
iqdtms.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
2 MB
25 doubleclick.net
securepubads.g.doubleclick.net
stats.g.doubleclick.net
googleads.g.doubleclick.net
125 KB
25 googlesyndication.com
tpc.googlesyndication.com
pagead2.googlesyndication.com
560 KB
17 moatads.com
z.moatads.com
mb.moatads.com
px.moatads.com
521 KB
7 onthe.io
cdn.onthe.io
tt.onthe.io
19 KB
6 demdex.net
dpm.demdex.net
iqdigital.demdex.net
4 KB
4 theadex.com
dmp.theadex.com
xpl.theadex.com
16 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
54 KB
3 google.com
adservice.google.com
513 B
3 google.de
adservice.google.de
513 B
3 adobedtm.com
assets.adobedtm.com
67 KB
3 amazon-adsystem.com
c.amazon-adsystem.com
aax.amazon-adsystem.com
22 KB
3 ioam.de
script.ioam.de
de.ioam.de
10 KB
2 googleapis.com
imasdk.googleapis.com
80 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 adition.com
dsp.adfarm1.adition.com
964 B
2 df-srv.de
d.df-srv.de
1 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
2 xplosion.de
ups.xplosion.de
5 KB
2 emetriq.de
dyn.emetriq.de
cdn.emetriq.de
2 KB
2 cloudfront.net
dx6ctphzljkf1.cloudfront.net
d1pywvbolq0b04.cloudfront.net
32 KB
2 yieldlab.net
ad.yieldlab.net
p.yieldlab.net
1 KB
1 2mdn.net
s0.2mdn.net
10 KB
1 radiantmediatechs.com
cdn.radiantmediatechs.com
2 KB
1 whitepaperdb.de
golem.whitepaperdb.de
1 criteo.net
static.criteo.net
12 KB
1 omtrdc.net
iqdigitalmediamarketinggmbh.sc.omtrdc.net
2 KB
1 everesttech.net
cm.everesttech.net
527 B
1 criteo.com
bidder.criteo.com
210 B
1 adnxs.com
ib.adnxs.com
6 KB
1 googletagservices.com
www.googletagservices.com
9 KB
222 32
Domain Requested by
72 www.golem.de www.golem.de
pagead2.googlesyndication.com
z.moatads.com
17 pagead2.googlesyndication.com www.golem.de
securepubads.g.doubleclick.net
pagead2.googlesyndication.com
14 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
10 googleads.g.doubleclick.net pagead2.googlesyndication.com
9 px.moatads.com www.golem.de
8 tpc.googlesyndication.com www.golem.de
securepubads.g.doubleclick.net
8 video.golem.de www.golem.de
text
7 z.moatads.com www.golem.de
6 tt.onthe.io cdn.onthe.io
6 cpxl.golem.de www.golem.de
4 dpm.demdex.net 1 redirects assets.adobedtm.com
www.golem.de
3 ssl.1.damoh.golem.de text
3 hgc-cf-cache-1.svonm.com www.golem.de
text
3 adservice.google.com www.googletagservices.com
pagead2.googlesyndication.com
3 adservice.google.de www.googletagservices.com
pagead2.googlesyndication.com
3 assets.adobedtm.com www.golem.de
assets.adobedtm.com
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 s3.amazonaws.com www.golem.de
text
2 dsp.adfarm1.adition.com 2 redirects
2 d.df-srv.de 1 redirects www.golem.de
2 xpl.theadex.com 1 redirects www.golem.de
2 de.ioam.de 1 redirects www.golem.de
2 iqdigital.demdex.net assets.adobedtm.com
www.golem.de
2 dmp.theadex.com www.golem.de
2 ups.xplosion.de www.golem.de
cdn.emetriq.de
2 c.amazon-adsystem.com www.golem.de
c.amazon-adsystem.com
2 ads.golem.de www.golem.de
2 iqdtms.golem.de www.golem.de
1 s0.2mdn.net imasdk.googleapis.com
1 cdn.radiantmediatechs.com www.golem.de
1 golem.whitepaperdb.de securepubads.g.doubleclick.net
1 static.criteo.net dx6ctphzljkf1.cloudfront.net
1 adstax-match.adrtx.net cdn.adrtx.net
1 stats.g.doubleclick.net www.golem.de
1 ssl.google-analytics.com 1 redirects
1 p.yieldlab.net www.golem.de
1 cdn.adrtx.net www.golem.de
1 cpx.golem.de www.golem.de
1 iqdigitalmediamarketinggmbh.sc.omtrdc.net assets.adobedtm.com
1 www.google-analytics.com www.golem.de
1 cdn.onthe.io www.golem.de
1 cm.everesttech.net 1 redirects
1 cdn.emetriq.de ups.xplosion.de
1 mb.moatads.com z.moatads.com
1 bidder.criteo.com dx6ctphzljkf1.cloudfront.net
1 ib.adnxs.com dx6ctphzljkf1.cloudfront.net
1 aax.amazon-adsystem.com c.amazon-adsystem.com
1 d1pywvbolq0b04.cloudfront.net www.golem.de
1 dyn.emetriq.de 1 redirects
1 dx6ctphzljkf1.cloudfront.net www.golem.de
1 ad.yieldlab.net www.golem.de
1 www.googletagservices.com iqdtms.golem.de
1 script.ioam.de www.golem.de
1 golem.de 1 redirects
222 54
Subject Issuer Validity Valid
*.golem.de
GeoTrust RSA CA 2018
2018-07-27 -
2019-08-28
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
2018-10-30 -
2019-01-22
3 months crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-02-08 -
2019-02-08
a year crt.sh
*.cloudfront.net
DigiCert Global CA G2
2018-10-08 -
2019-10-09
a year crt.sh
c.amazon-adsystem.com
Amazon
2018-03-12 -
2019-03-12
a year crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2018-10-30 -
2019-01-22
3 months crt.sh
moatads.com
DigiCert ECC Secure Server CA
2018-01-09 -
2019-01-09
a year crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-03-06 -
2019-01-12
10 months crt.sh
assets.adobedtm.com
DigiCert SHA2 High Assurance Server CA
2018-04-06 -
2019-04-11
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.google.com
Google Internet Authority G3
2018-10-30 -
2019-01-22
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-03-08 -
2019-03-08
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2018-01-25 -
2019-01-25
a year crt.sh
*.criteo.com
DigiCert SHA2 Secure Server CA
2018-11-05 -
2020-01-03
a year crt.sh
*.moatads.com
DigiCert SHA2 Secure Server CA
2018-04-27 -
2019-04-27
a year crt.sh
*.demdex.net
DigiCert SHA2 High Assurance Server CA
2018-01-09 -
2021-02-12
3 years crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-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
2018-10-30 -
2019-01-22
3 months crt.sh
*.sc.omtrdc.net
DigiCert SHA2 High Assurance Server CA
2016-05-04 -
2019-05-23
3 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh
*.df-srv.de
Thawte TLS RSA CA G1
2018-01-16 -
2019-12-12
2 years crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-08-02 -
2019-10-25
a year crt.sh
*.criteo.net
DigiCert SHA2 Secure Server CA
2018-11-08 -
2019-12-19
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year crt.sh
golem.whitepaperdb.de
Let's Encrypt Authority X3
2018-11-03 -
2019-02-01
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
2018-10-30 -
2019-01-22
3 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2018-11-12 -
2019-02-10
3 months crt.sh
*.doubleclick.net
Google Internet Authority G3
2018-10-30 -
2019-01-22
3 months crt.sh

This page contains 24 frames:

Primary Page: https://www.golem.de/
Frame ID: 8F2799459A01EA2C9E333735813315FB
Requests: 178 HTTP requests in this frame

Frame: https://iqdigital.demdex.net/dest5.html?d_nsid=0
Frame ID: 67C448E43C1F73BB585748EE1F4D9DF6
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Frame ID: 760C7856F51FA84CE5BBD79C65D7CD36
Requests: 3 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Frame ID: 4DA7D035D5FEB7BB205B7E15036DD719
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Frame ID: 90F380DDB55AC6B0C814832F157329CF
Requests: 4 HTTP requests in this frame

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

Frame: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Frame ID: C7F8D6E291301DCEE45A975EADB1ECDF
Requests: 10 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Frame ID: 2D02679879CC1D63714A0C8F76A06061
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Frame ID: 4A9ECF76DB25B20314FB48233358C06A
Requests: 10 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/zrt_lookup.html
Frame ID: 34E55AEABF4A634483C62A9035FD84AB
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1543333693&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=1543333692792&bpp=14&bdt=1426&fdt=409&idt=405&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&correlator=6405723172870&frm=20&pv=2&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=4255&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=7&uci=7.gdywhbt36lx1&fsb=1&xpc=VHErRYnwdV&p=https%3A//www.golem.de&dtd=451
Frame ID: 0EB0F333C7AD478E8CA6725315814D92
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Frame ID: B897BF783F4B019F181F1E1AF58D412D
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/zrt_lookup.html
Frame ID: C695A0AA9B4983EC2D803FAEAC7291DB
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=1543333693&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=1543333692806&bpp=6&bdt=1439&fdt=499&idt=391&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=6405723172870&frm=20&pv=1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=4998&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=8&uci=8.es833sh6jb0x&fsb=1&xpc=h6NQ0X1ZfR&p=https%3A//www.golem.de&dtd=507
Frame ID: EC2A6389EA39BB84A9A1CAFA2E812E8A
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/zrt_lookup.html
Frame ID: FB1A661CD31F8911117E57FE1721A77C
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=1543333693&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=1543333692812&bpp=13&bdt=1446&fdt=592&idt=385&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=6405723172870&frm=20&pv=1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=5729&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=9&uci=9.vdpd0mqq54cy&fsb=1&xpc=QlY3qhP4ur&p=https%3A//www.golem.de&dtd=605
Frame ID: E4E9523780D17D68D80E999F421467E1
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/zrt_lookup.html
Frame ID: D7B41A75EE65C9327B663B55244FC6E7
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=8574733096&adk=667898199&adf=3902893106&w=300&guci=1.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&avail_w=0&wgl=1&adsid=NT&dt=1543333693056&bpp=24&bdt=632&fdt=399&idt=396&shv=r20181107&cbv=r20180604&saldr=aa&correlator=6405723172870&frm=23&ife=4&pv=2&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=1382438205&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=993&ady=3918&biw=1585&bih=1200&isw=300&ish=250&ifk=1933803164&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=2&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C300%2C250&vis=1&rsz=o%7Co%7CeEbr%7C&abl=NS&ppjl=u&pfx=0&fu=20&bc=15&osw_key=1990427054&ifi=1&uci=1.ssy9wg2utked&fsb=1&dtd=409
Frame ID: 58CA6225C813F61A7B6F43373BF144CD
Requests: 1 HTTP requests in this frame

Frame: https://golem.whitepaperdb.de/?tag=golem
Frame ID: 43C8396655A44DCC40E98CE8E51D52C6
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Frame ID: DE6A393D1C09040B0E52E8FBAF2BA39B
Requests: 5 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/zrt_lookup.html
Frame ID: D0850B9CAA49FC5E21A8E7D9D8F1C211
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Frame ID: 4891A653628E1A585562049463E4C750
Requests: 4 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=1807761192&adf=4218561337&w=800&guci=1.2.0.0.2.2.0.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1543333693275&bpp=17&bdt=844&fdt=787&idt=786&shv=r20181107&cbv=r20180604&saldr=aa&correlator=6405723172870&frm=23&ife=4&pv=1&ga_vid=1741087841.1543333694&ga_sid=1543333694&ga_hid=856712356&ga_fc=0&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=11326&biw=1585&bih=1200&isw=800&ish=250&ifk=539073182&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=2&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=15&osw_key=2012678058&ifi=1&uci=1.ggn3zd2gw9bm&fsb=1&dtd=796
Frame ID: E5BC9FEE44C90477528F6DEADC9169DC
Requests: 1 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.259.0_de.html
Frame ID: 0BF34952577CB29E626DAFEDCF32FD7A
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
  • env /^criteo/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 /^s_(?:account|objectID|code|INST)$/i

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

Page Statistics

222
Requests

97 %
HTTPS

39 %
IPv6

32
Domains

54
Subdomains

50
IPs

6
Countries

3664 kB
Transfer

8134 kB
Size

5
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 26
  • https://dyn.emetriq.de/loader/97578/default.js HTTP 302
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Request Chain 63
  • https://cm.everesttech.net/cm/dd?d_uuid=89801360581190805020604735665356488189 HTTP 302
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W-1nPAAADo2iaxN_
Request Chain 73
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0018&i2=001882341b24b0f715bfd673b&ep=1569625879&vr=411&id=s9k4qs&dntt=0&lt=1543333692495&ev=&cs=w5wn9t&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0018&i2=001882341b24b0f715bfd673b&ep=1569625879&vr=411&id=s9k4qs&dntt=0&lt=1543333692495&ev=&cs=w5wn9t&mo=1&sr=71
Request Chain 130
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000719061648120149&axd_pid=22&axd_fuid=BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr
Request Chain 131
  • https://d.df-srv.de/match/a.js?pid=42 HTTP 302
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25 HTTP 302
  • https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6628567733988423701
Request Chain 132
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=597865348&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=186515157&utmr=-&utmp=%2F&utmht=1543333692680&utmac=UA-518800-2&utmcc=__utma%3D21769261.1186514941.1543333692.1543333692.1543333692.1%3B%2B__utmz%3D21769261.1543333693.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=1691580632&utmredir=1&utmu=qRQAAAAAAAAAAAAAAAQAAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1186514941.1543333692&jid=1691580632&_v=5.7.2&z=597865348
Request Chain 133
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25 HTTP 302
  • https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6628567733988423701
Request Chain 134
  • https://dpm.demdex.net/ibs:dpid=78959&redir=https%3A%2F%2Fdmp.theadex.com%2Fd%2F226%2Fi%2F2.gif%3Faxd_pid%3D97%26axd_fuid%3D%25DID%25 HTTP 302
  • https://dmp.theadex.com/d/226/i/2.gif?axd_pid=97&axd_fuid=89801360581190805020604735665356488189

222 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/
177 KB
177 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
a1e788adb2429a92ecb84b5feefd533973ee377f8304cbb037e9cd857d6cd538
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
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
Tue, 27 Nov 2018 15:48:11 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=Wed, 28-Nov-2018 03:48:11 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_114-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_114-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
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-12251"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Fri, 28 Dec 2018 15:48:11 GMT
iqd_gzip_test.js.gz
iqdtms.golem.de/
23 B
491 B
Script
General
Full URL
https://iqdtms.golem.de/iqd_gzip_test.js.gz
Requested 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.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 13 Jan 2015 08:41:49 GMT
Server
nginx
x-amz-request-id
87D1833BBBF1EAEA
ETag
"1ec37da4a5d51c998484c055cc5ae466"
Content-Type
application/x-gzip
X-UPSTREAM
52.219.72.56:443 hybrid2.golem.de
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23
x-amz-id-2
E1M0fr7nWO7X7M/TCM8zZrYHF7AUZW2yUE3C3mtDiksxoPSQrsIjpkAJQvCgK/LfywK1tABob7s=
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
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-e82"
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
3714
Expires
Fri, 28 Dec 2018 15:48:11 GMT
137935-180225-180223_rc.jpg
www.golem.de/1811/
40 KB
40 KB
Image
General
Full URL
https://www.golem.de/1811/137935-180225-180223_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
e5ab2409c8af2c590ffae89826aeb3966d5decfed18a8f307aaab201b78bf1a6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 27 Nov 2018 12:30:05 GMT
Server
nginx
ETag
"5bfd38cd-a02a"
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
41002
Expires
Fri, 28 Dec 2018 15:48:11 GMT
137947-180270-180263_rc.jpg
www.golem.de/1811/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/1811/137947-180270-180263_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
9ad533655968292ca93504ed0176ee49af127aa4f5fda3de908747d56fc97c9b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 27 Nov 2018 15:10:04 GMT
Server
nginx
ETag
"5bfd5e4c-c7c"
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
3196
Expires
Fri, 28 Dec 2018 15:48:11 GMT
137911-180242-180241_rc.jpg
www.golem.de/1811/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1811/137911-180242-180241_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
7ed1351375326158a611b20b9f3623364fd5e4b88166c22c58c13e83638f634b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 27 Nov 2018 15:00:05 GMT
Server
nginx
ETag
"5bfd5bf5-1ed9"
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
7897
Expires
Fri, 28 Dec 2018 15:48:11 GMT
137944-180253-180250_rc.jpg
www.golem.de/1811/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1811/137944-180253-180250_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
6e1cf3be4efad8bcc621be807ef43fae10ae179a960ecc6493f0bc7a4d5dba44

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 27 Nov 2018 14:25:05 GMT
Server
nginx
ETag
"5bfd53c1-1162"
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
4450
Expires
Fri, 28 Dec 2018 15:48:11 GMT
137934-180214-180211_rc.jpg
www.golem.de/1811/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1811/137934-180214-180211_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
9e32017de88a0242ba838a7d7e4c6502361d1f1182b23e1e58ea341063a61a22

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 27 Nov 2018 10:40:04 GMT
Server
nginx
ETag
"5bfd1f04-27d5"
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
10197
Expires
Fri, 28 Dec 2018 15:48:11 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=1543333142&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
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
Tue, 27 Nov 2018 15:48:11 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
774
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
das-vermaechtnis-von-3dfx-kickstarter-trailer.jpg
video.golem.de/teaser/1/1/22153/thumb-high-1000/
123 KB
123 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22153/thumb-high-1000/das-vermaechtnis-von-3dfx-kickstarter-trailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
48390c7a04979865204972f6f0dd36774ae2d541d986eb23585ead25870ff9e3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Mon, 26 Nov 2018 08:13:10 GMT
Server
nginx
ETag
"5bfbab16-1eb30"
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
125744
Expires
Fri, 28 Dec 2018 15:48:11 GMT
macmini18-snap.jpg
video.golem.de/teaser/1/1/22149/thumb-high-1000/
123 KB
124 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22149/thumb-high-1000/macmini18-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
856b6741d6962986a71978b5372c1448273435052c75c498d926fbecbb974e9b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Fri, 23 Nov 2018 15:26:01 GMT
Server
nginx
ETag
"5bf81c09-1ed26"
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
126246
Expires
Fri, 28 Dec 2018 15:48:11 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=1543332242&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
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
Tue, 27 Nov 2018 15:48:11 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
773
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
137800-179568-179564_rc.jpg
www.golem.de/1811/
121 KB
121 KB
Image
General
Full URL
https://www.golem.de/1811/137800-179568-179564_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
f86194d145cf109f794344c197a0ddf0ce7a37975833f8b97255b4771e056458

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 20 Nov 2018 09:33:05 GMT
Server
nginx
ETag
"5bf3d4d1-1e339"
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
123705
Expires
Fri, 28 Dec 2018 15:48:11 GMT
137848-179866-179863_rc.jpg
www.golem.de/1811/
103 KB
103 KB
Image
General
Full URL
https://www.golem.de/1811/137848-179866-179863_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
e87217e45ca81de8e3ce6d47c98bcdcef0bc746607d3bbcc0d60fc1283b78ca1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Thu, 22 Nov 2018 11:04:06 GMT
Server
nginx
ETag
"5bf68d26-19b4d"
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
105293
Expires
Fri, 28 Dec 2018 15:48:11 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
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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-190c7"
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
Fri, 28 Dec 2018 15:48:11 GMT
longread-swiper_122-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_122-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
08b757c7ef1eaebe9fb2331abd30ecc0a470c2166994c1cfa941c126a698679c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Fri, 07 Sep 2018 13:24:16 GMT
Server
nginx
ETag
W/"5b927c00-8e6"
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
Fri, 28 Dec 2018 15:48:11 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
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 27 Nov 2018 15:48:11 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
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
Tue, 27 Nov 2018 15:48:11 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
Fri, 28 Dec 2018 15:48:11 GMT
iam.js
script.ioam.de/
26 KB
9 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 0018
Resource Hash
af837b5592f328e2ea68ecbd900385a260bca784d41fc9c021ec4a2d9c058589

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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Tue, 27 Nov 2018 15:48:11 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 0018
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
Tue, 27 Nov 2018 17:48:11 GMT
iqadcontroller.js.gz
iqdtms.golem.de/cdn_golem_dt/live/
210 KB
55 KB
Script
General
Full URL
https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
Requested 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.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3decf22795bbd3fca66f2438ff290db107fdcb21ef0c0f582fe8429d7c3b33f0

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Tue, 27 Nov 2018 10:13:12 GMT
Server
nginx
x-amz-request-id
A8102F02A2822436
ETag
"c71baad6e7dc17f1035a29ab7b67834d"
Content-Type
text/javascript
X-UPSTREAM
52.219.72.0:443 hybrid1.golem.de
Cache-Control
max-age=900,s-maxage=60,public,stale-while-revalidate=2880000
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
55420
x-amz-id-2
aMATrTbSqiQ8PTEsfQ1T92Z9g5DGePvQAiHTpfpd2x2hfFMykY/eIeJUmG2vQXaO9ILdAiqdIwM=
gpt.js
www.googletagservices.com/tag/js/
26 KB
9 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: iqdtms.golem.de
URL: https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
c08aa5078a5a2a244f92077b9f8d701ece881b096be8f5dced227d8ae2c2e760
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
Tue, 27 Nov 2018 15:48:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"10 / 37 of 1000 / last-modified: 1542337187"
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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
9355
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:11 GMT
26033,26034,26035,660053,660071,660107,660089,5108423,6378523,464839
ad.yieldlab.net/yp/
154 B
807 B
Script
General
Full URL
https://ad.yieldlab.net/yp/26033,26034,26035,660053,660071,660107,660089,5108423,6378523,464839?ts=1543333691729&yl_rtb_pubkey=21719_golem
Requested 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.232.233 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8

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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Content-Language
de-DE
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
Content-Type
text/javascript;charset=UTF-8
Content-Length
123
Expires
Mon, 26 Nov 2018 15:48:11 GMT
prebid29082018.js
dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/
101 KB
32 KB
Script
General
Full URL
https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2047:9a00:1:9777:c740:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
d77b6c18c0744a7ad3e394c6de665cfec35053d2ccc2e3d31aaece762cf6bbfd

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, 07 Sep 2018 08:00:09 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 15:48:59 GMT
server
AmazonS3
age
1929016
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=5184000
x-amz-cf-id
Oy9XfS9hEo-YAIGcXjx42yy5rBVsNq-UM1kEhS2NcGlBpz0OOZjJYw==
via
1.1 91db3e27f70759a0dea967c4b34efea9.cloudfront.net (CloudFront)
apstag.js
c.amazon-adsystem.com/aax2/
64 KB
19 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.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
143.204.212.210 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-212-210.fra53.r.cloudfront.net
Software
Server /
Resource Hash
e9ce46e8ee41d0f52c72c6e33af7b559667a79e1c77725e1a796066c92014671

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
Mon, 26 Nov 2018 16:37:14 GMT
Content-Encoding
gzip
Server
Server
Age
83456
ETag
c54a6aa3815631c393c0f3372010e2c1
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 d16428714e022976873ccc980fdc1289.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
Connection
keep-alive
Accept-Ranges
bytes
X-Amz-Cf-Id
9ShN1nZ1vs-bE4Kr9ZEoWD1du4-Sk5YJTu-mvdi5uPwydoEOdrrQaQ==
imgad
tpc.googlesyndication.com/pagead/
25 B
191 B
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDTj9fOKBABGAEoATIIXhWOvj-krslA_KSrtwU
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
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
Wed, 21 Nov 2018 16:49:23 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
age
514728
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
application/x-javascript; charset=UTF-8
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
45
x-xss-protection
1; mode=block
expires
Wed, 28 Nov 2018 16:49:23 GMT
yi.js
z.moatads.com/iqdigitaldfpprebidheader645711382528/
93 KB
28 KB
Script
General
Full URL
https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yi.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
ade647cbdadc97e5b51be05d1a4d158981dd24ead69e64ac2a3af095c85bc9aa

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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Wed, 10 Oct 2018 19:59:28 GMT
Server
AmazonS3
x-amz-request-id
A837F4A023DDD17A
ETag
"72ec5a0b2deffe9547d6fa0fea822db5"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=43502
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
28487
x-amz-id-2
JKbu5T6l2XRJzfDuKkRQfFoKsX5dMTu1rXE703PnrtVcQQ4HF+EuQluyWZyGHR9UNyRq/DbPvio=
default.js
ups.xplosion.de/loader/97578/
Redirect Chain
  • https://dyn.emetriq.de/loader/97578/default.js
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
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.17.26.15 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-17-26-15.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954

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
Tue, 27 Nov 2018 15:48:12 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
1544

Redirect headers

Location
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Date
Tue, 27 Nov 2018 15:48:11 GMT
Server
Apache-Coyote/1.1
Connection
keep-alive
Content-Length
0
launch-EN92e1075482f3410d81944270acba8d90.min.js
assets.adobedtm.com/
123 KB
39 KB
Script
General
Full URL
https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.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
23.211.8.45 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-8-45.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
e04546f3c2c00f237774a2f85861db5040ca708d188918116f542b304f4e9bdc

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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Mon, 26 Nov 2018 08:42:46 GMT
Server
Apache
ETag
"06b4b0983aaa67a030d5ae574729e84f:1543221766"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
39112
Expires
Tue, 27 Nov 2018 16:48:11 GMT
adex.js
dmp.theadex.com/d/494/1428/s/
39 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/494/1428/s/adex.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
89.163.159.112 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
5a72e2e47b09ebb15e505f122de6e711741a774faf69b0e7c5d8835440d5de3f

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
Tue, 27 Nov 2018 15:48:11 GMT
Content-Encoding
gzip
Last-Modified
Wed, 17 Oct 2018 17:36:21 GMT
Server
nginx
ETag
W/"5bc77315-9b5b"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=300
Access-Control-Allow-Credentials
true
Connection
keep-alive
Expires
Tue, 27 Nov 2018 15:53:11 GMT
vis.js
d1pywvbolq0b04.cloudfront.net/iqdvis/golem/
1 KB
823 B
Script
General
Full URL
https://d1pywvbolq0b04.cloudfront.net/iqdvis/golem/vis.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2047:8800:1c:9fd1:6d00:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f86b70f6a693273480dcde347052929ca26f16c212eddd5aef1dca024df86f95

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, 02 Nov 2018 10:38:47 GMT
content-encoding
gzip
last-modified
Fri, 02 Nov 2018 10:33:59 GMT
x-amz-meta-expires
Sat, 01 Dec 2018 17:00:00 GMT
age
2178565
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/javascript
status
200
x-amz-meta-contenttype
text/javascript
x-amz-cf-id
tOYlEFUiqQWWBe9FMA5KCir98cDiUQstLCV_i7blKqQim7rotQdCDQ==
via
1.1 b2eb119180a1f499dade55aa4e26c619.cloudfront.net (CloudFront)
server
AmazonS3
expires
Sat, 01 Dec 2018 17:00:00 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
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Fri, 28 Dec 2018 15:48:11 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
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Fri, 28 Dec 2018 15:48:11 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
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Fri, 28 Dec 2018 15:48:11 GMT
truncated
/
258 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 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
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
Tue, 27 Nov 2018 15:48:11 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Fri, 28 Dec 2018 15:48:11 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81d::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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
pubads_impl_275.js
securepubads.g.doubleclick.net/gpt/
182 KB
62 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
7751b706f0e0b70939bac114d3828d092891997600268ea75959c3378c536b1a
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
Tue, 27 Nov 2018 15:48:11 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 09 Nov 2018 18:14:17 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,35"
content-length
62956
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:11 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.212.210 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-212-210.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

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
Thu, 11 Oct 2018 16:32:26 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin
Age
83615
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Fri, 24 Aug 2018 07:13:51 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET
Content-Type
application/javascript
Via
1.1 73f3a23156999272233949c078c30859.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
X-Amz-Cf-Id
HX8az5NNOJAgRGVGHUBx1j7Ef78ZDRksnS5nppoD-ol4Q_Gbon6ghA==
bid
aax.amazon-adsystem.com/e/dtb/
47 B
341 B
XHR
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3711&u=https%3A%2F%2Fwww.golem.de%2F&pid=8669019415021543333691918&cb=4362004534381543333691921&ws=1600x1200&v=7.20.00&t=2000&slots=%5B%7B%22sd%22%3A%22iqadtile1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22golem-iqadtile1%22%7D%2C%7B%22sd%22%3A%22iqadtile16%22%2C%22s%22%3A%5B%22728x90%22%2C%22970x250%22%5D%2C%22sn%22%3A%22golem-iqadtile16%22%7D%2C%7B%22sd%22%3A%22iqadtile3%22%2C%22s%22%3A%5B%22970x250%22%5D%2C%22sn%22%3A%22golem-iqadtile3%22%7D%2C%7B%22sd%22%3A%22iqadtile4%22%2C%22s%22%3A%5B%22970x250%22%5D%2C%22sn%22%3A%22golem-iqadtile4%22%7D%2C%7B%22sd%22%3A%22iqadtile5%22%2C%22s%22%3A%5B%22970x250%22%5D%2C%22sn%22%3A%22golem-iqadtile5%22%7D%2C%7B%22sd%22%3A%22iqadtile8%22%2C%22s%22%3A%5B%22300x250%22%2C%22300x600%22%5D%2C%22sn%22%3A%22golem-iqadtile8%22%7D%2C%7B%22sd%22%3A%22iqadtile9%22%2C%22s%22%3A%5B%22300x250%22%2C%22300x600%22%5D%2C%22sn%22%3A%22golem-iqadtile9%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.216.48 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
a43196cef5e2a4bc71ea63265be5fce317c5abdca3b9fd708dfdc771ed780518

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
Tue, 27 Nov 2018 15:48:12 GMT
Server
Server
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
47
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

Request headers

Response headers

Access-Control-Allow-Origin
*
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

Access-Control-Allow-Origin
*
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

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
prebid
ib.adnxs.com/ut/v3/
11 KB
6 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.202 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
ac3fd72c715cf0c48d6261a23516c25fd67c6db949bb2ab4331b8d32886b002a
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
Tue, 27 Nov 2018 15:48:14 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.34.41.50; 185.34.41.50; 318.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.44:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
735ed7c1-d427-45a2-ae6e-0197cb2f565f
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
cdb
bidder.criteo.com/
0
210 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=207&av=11&wv=1.20.0&cb=97505910291
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.0.93 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Access-Control-Allow-Origin
https://www.golem.de
Date
Tue, 27 Nov 2018 15:48:11 GMT
Access-Control-Allow-Credentials
true
Server
Finatra
Timing-Allow-Origin
*
Vary
Origin
yi.js
mb.moatads.com/
2 KB
2 KB
Script
General
Full URL
https://mb.moatads.com/yi.js?ud=undefined&qn=(%2BIb%7Cj8o%3FJ(jkkeL07ta_*JRM!6t9B%2CN%3Ey)%2ChXbvU37_*NhSfBghz%5D*vOJ%23_%3DNoUA%5DRgBU_Gr1%3E%3AHuFTn%3ADXqJHZ%3BR%23yAb%2Bho8bYLaXBjA%3AmQ)%3CF!tAbjrzJ%3BgoVYGVxc%40lQQV%23tc3%2Fh%7C%3FVKV%3BW5.NO)Wx%7C*E%24%3D!L2ux%7Ci_lOfxECSR23_hFAkD%3Dv%3CN%5B.%22%24b_o%3FtVD%5D%5BpN%7CQF%40Sy7%7BA&qp=00000&is=voqBBkBBy4HhBBwBBBBJjBRCqUCY3CTCB6BXwUcu8gKCBS9lYBBBCCBpYFmR4BOZBBgSJTcBBBBBBBBHUoKOFCyz7BB3CZ6mv5TimBBe9oeCt9lXqBvBCfBBBBBBBBBBBBBBCBMBaBeBBkKzQClBeaKaMVMBj5iMPzyHVY9zqxknZlysGxCBcBBBC9CctORpnICyRBBB4OBBBBBBBBBBC9TiFF3dOKBCBBxBBBBBBBfBz1BD7fB3BpkBJUDyDCZ6IDDDCCCCDDCCCCCCCBdh2eBBBGI79kNB8DJoDBBBBCiBBiB&iv=6&qt=0&gz=0&hh=0&hn=0&tw=null&qc=0&qd=0&qf=1600&qe=1200&qh=1600&qg=1200&qm=0&qa=1600&qb=1200&qi=1600&qj=1200&qr=0&url=https%3A%2F%2Fwww.golem.de%2F&confidence=2&pcode=iqdigitaldfpprebidheader645711382528&callback=MoatNadoAllJsonpRequest_88919268
Requested by
Host: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yi.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.177.180.124 London, United Kingdom, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-177-180-124.eu-west-2.compute.amazonaws.com
Software
nginx/1.7.9 /
Resource Hash
3759e8a491866813c5aa87d889c3471a46da21deb2f5c1298d3dc4cd59c88568

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
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx/1.7.9
Etag
"4942a46e798ea6615f806f3fb024c0558cb10409"
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=900
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
1688
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=17&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&na=1630954958&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:12 GMT
truncated
/
768 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
26 KB
26 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
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
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Fri, 28 Dec 2018 15:48:12 GMT
id
dpm.demdex.net/
1 KB
1 KB
XHR
General
Full URL
https://dpm.demdex.net/id?d_visid_ver=3.3.0&d_fieldgroup=MC&d_rtbd=json&d_ver=2&d_orgid=41833DF75A550B4B0A495DA6%40AdobeOrg&d_nsid=0&ts=1543333692152
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.108.5 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-108-5.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
475bebdeebcba2b0c9ea6e090b21682e61ab214be27f67928fb7c8e1940041f0

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

DCS
dcs-prod-irl1-v012-0a9a04b5e.edge-irl1.demdex.com 5.44.0.20181114104409 4ms
Pragma
no-cache
Content-Encoding
gzip
X-TID
Ko/5eGBWRT0=
Vary
Origin, Accept-Encoding, User-Agent
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=utf-8
Content-Length
537
Expires
Thu, 01 Jan 1970 00:00:00 GMT
EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
assets.adobedtm.com/BL4060cac02a7a4bf1aca763da0a266b4c/
105 KB
28 KB
Script
General
Full URL
https://assets.adobedtm.com/BL4060cac02a7a4bf1aca763da0a266b4c/EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.211.8.45 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-8-45.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
8212b4b59216f2b34dc1889ffd1c2ece0f153638628a54705e16273d6de2530c

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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Mon, 26 Nov 2018 08:42:46 GMT
Server
Apache
ETag
"6c784665666627e98dfa2e2847dea232:1543221766"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*, *
Content-Length
28019
Expires
Tue, 27 Nov 2018 16:48:12 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=0&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=0&zMoat_YI1=0&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1994206444&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:12 GMT
p.min.js
cdn.emetriq.de/adp/profiling/0.1.13/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2047:ee00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f

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, 31 May 2017 11:06:08 GMT
content-encoding
gzip
last-modified
Tue, 11 Apr 2017 11:21:30 GMT
server
AmazonS3
age
662636
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
FiFeAFfpoMZPPyU16IPZd0oUAvReA_Mm
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
_4tJsefGhS8O0FoQxOK1lvKVPpRbMXpbgrKidfTWAkG70RurV6j7Zg==
via
1.1 e1f6fa82d37f125cb361c7c37faf6662.cloudfront.net (CloudFront)
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
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_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CvVersion%7C3.3.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-fb2"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4018
Expires
Fri, 28 Dec 2018 15:48:12 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=44&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=262&zMoatAllDataLoadTime=262&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=262&zMoat_YI3=262&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=917093266&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:12 GMT
ads
securepubads.g.doubleclick.net/gampad/
22 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=981923346057591&correlator=885489351718910&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21062452&vrg=275&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C728x90&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile1%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26iqadtype%3Donline%26tile%3D1%26m_mv%3D80%2C70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=15&abxe=1&lmt=1543333692&dt=1543333692354&dlt=1543333691366&idt=884&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=0&adk=242336818&uci=1&gut=v2&ifi=1&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=47&icsg=8623499776&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x-1&msz=1000x-1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
8ba3ec7c2c7eacf9a5d8d36238d055b152c7121152d774aef7eccd0718366e53
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
Tue, 27 Nov 2018 15:48:12 GMT
content-encoding
gzip
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,35"
content-length
6294
x-xss-protection
1; mode=block
google-lineitem-id
4775329615
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138242228674
content-type
text/javascript; 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_275.js
securepubads.g.doubleclick.net/gpt/
61 KB
23 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
sffe /
Resource Hash
850a4c6decf68c2ff186703ea85e4703dd5c285a2e42fe47d974b3ad7455a4fb
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
Tue, 27 Nov 2018 15:48:12 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 09 Nov 2018 18:14:17 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,35"
content-length
23441
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:12 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_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::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

ads
securepubads.g.doubleclick.net/gampad/
22 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=981923346057591&correlator=885489351718910&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21062452&vrg=275&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x250%7C1000x100%7C970x90%7C940x250%7C970x250%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile3%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26iqadtype%3Donline%26tile%3D3%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=15&abxe=1&lmt=1543333692&dt=1543333692371&dlt=1543333691366&idt=884&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=2638043459&uci=2&gut=v2&ifi=2&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=48&icsg=146062453248&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x10506&msz=99x1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&fws=128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
e4af86fe5e5ac087b6e940db24da1c877da8feb34b74d72c78488b12cb726af4
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
Tue, 27 Nov 2018 15:48:12 GMT
content-encoding
gzip
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,35"
content-length
6291
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235188578
content-type
text/javascript; 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
ads
securepubads.g.doubleclick.net/gampad/
26 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=981923346057591&correlator=885489351718910&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21062452&vrg=275&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile9%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26iqadtype%3Donline%26tile%3D9%26hb_format%3Dbanner%26hb_source%3Dclient%26hb_deal_appnexus%3D490143%26hb_size%3D300x250%26pbjscpm%3D0.41%26hb_pb%3D0_40%26hb_adid%3D8375aa05678f2e%26hb_bidder%3Dappnexus%26m_mv%3D30%2C20%2C10%26m_gv%3D30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=15&abxe=1&lmt=1543333692&dt=1543333692380&dlt=1543333691366&idt=884&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=2305067533&uci=3&gut=v2&ifi=3&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=48&icsg=146062453248&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x483&msz=99x3&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&fws=128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
773514f1e549833bd8347bac676f2c0e9cd6ca68c5490a7ded9572eefff6e4a9
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
Tue, 27 Nov 2018 15:48:12 GMT
content-encoding
gzip
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,35"
content-length
7019
x-xss-protection
1; mode=block
google-lineitem-id
4643513462
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138234532157
content-type
text/javascript; 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
ads
securepubads.g.doubleclick.net/gampad/
26 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=981923346057591&correlator=885489351718910&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21062452&vrg=275&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x333%7C1000x167%7C1000x125%7C1000x100%7C970x250%7C800x250%7C970x90%7C728x90%7C660x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile16%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26iqadtype%3Donline%26tile%3D16%26m_mv%3DslotNoSlotData%26m_gv%3DslotNoSlotData&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie_enabled=1&bc=15&abxe=1&lmt=1543333692&dt=1543333692391&dlt=1543333691366&idt=884&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3736976088&uci=4&gut=v2&ifi=4&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=49&icsg=146062453248&std=0&csl=81&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=99x1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&fws=128
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
78253896640573f5c97f4d0c21c5cf830c93d31cb4dba26faa74d53a15474491
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
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
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,35"
content-length
7026
x-xss-protection
1; mode=block
google-lineitem-id
4643517062
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138234541632
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
Cookie set dest5.html
iqdigital.demdex.net/ Frame 67C4
0
0
Document
General
Full URL
https://iqdigital.demdex.net/dest5.html?d_nsid=0
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.49.41.66 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-49-41-66.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash

Request headers

Host
iqdigital.demdex.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
Cookie
demdex=89801360581190805020604735665356488189
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

Accept-Ranges
bytes
Cache-Control
max-age=21600
Content-Encoding
gzip
Content-Type
text/html
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Last-Modified
Thu, 15 Nov 2018 08:54:38 GMT
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Pragma
no-cache
Set-Cookie
demdex=89801360581190805020604735665356488189;Path=/;Domain=.demdex.net;Expires=Sun, 26-May-2019 15:48:12 GMT;Max-Age=15552000
Vary
Accept-Encoding, User-Agent
X-TID
Dl7OcybTQj0=
Content-Length
2766
Connection
keep-alive
ibs:dpid=411&dpuuid=W-1nPAAADo2iaxN_
dpm.demdex.net/
Redirect Chain
  • https://cm.everesttech.net/cm/dd?d_uuid=89801360581190805020604735665356488189
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W-1nPAAADo2iaxN_
42 B
769 B
Image
General
Full URL
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W-1nPAAADo2iaxN_
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.194.108.5 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-108-5.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

DCS
dcs-prod-irl1-v012-0daa0a276.edge-irl1.demdex.com 5.44.0.20181114104409 3ms
Pragma
no-cache
X-TID
jcSaDdCmRqo=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Date
Tue, 27 Nov 2018 15:48:12 GMT
Server
AMO-cookiemap/1.1
P3P
CP="NOI NID DEVa PSAa PSDa OUR IND PUR COM NAV INT DEM"
Location
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W-1nPAAADo2iaxN_
Cache-Control
no-cache
Connection
Keep-Alive
Keep-Alive
timeout=15,max=100
Content-Length
0
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&event_id=page_view&_sid=97578&_ver=0.1.13&_seg=jsonp&_=775785891597
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.17.26.15 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-17-26-15.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
50689dfb1260231668827e97274448ee7e035a3ba815dd907b10c94dbd5accff

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
Tue, 27 Nov 2018 15:48:12 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
1498
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
74 KB
27 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
SPDY
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
8311bc3a855c02e96954acba57ca59878afff0d519b0a161df0e75f95f49fe4a
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
Tue, 27 Nov 2018 15:48:12 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27972
x-xss-protection
1; mode=block
server
cafe
etag
800816325515767930
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:12 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=
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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Wed, 15 Aug 2018 21:00:18 GMT
Server
nginx
ETag
W/"5b749462-7ff"
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
Fri, 28 Dec 2018 15:48:12 GMT
gx-ads.js
ads.golem.de/track.ads/
124 B
492 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=2590397049643820&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
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 12 Jan 2016 21:49:10 GMT
Server
nginx
ETag
"569574d6-7c"
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
124
Expires
Fri, 28 Dec 2018 15:48:12 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/ Frame 760C
73 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
106c5562d37543e0d9505b8b75c787eaeaa2ee08a99f9f385568f565b0444afb
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
Tue, 27 Nov 2018 14:32:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
4556
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27325
x-xss-protection
1; mode=block
server
cafe
etag
2726007002868826454
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 11 Dec 2018 14:32:16 GMT
imgad
pagead2.googlesyndication.com/pagead/
2 KB
3 KB
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/imgad?id=CICAgIDQ04jCzgEQARgBKAEyCLeTE4Yu5hvQQMa81o0F
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
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
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
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
Mon, 26 Nov 2018 03:43:01 GMT
x-content-type-options
nosniff
server
cafe
age
129911
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
image/png
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="image.png"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
2437
x-xss-protection
1; mode=block
expires
Mon, 03 Dec 2018 03:43:01 GMT
osd.js
pagead2.googlesyndication.com/pagead/
74 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/osd.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
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
e9cf77edb95978fa6b193724ee40fde091368427e030fed8735cdef6b1a35535
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
Tue, 27 Nov 2018 15:34:31 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
821
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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27460
x-xss-protection
1; mode=block
server
cafe
etag
5000825381819961729
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=3600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 16:34:31 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 760C
0
270 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss-sko4-owFIkUbaFkV7ozXJooNyV8zycCr33ESBm_Gk6wDM5_SZsN5RPn03r-pA7ha8jOpM0M4z6de6Ir4zIzWtnLkTqqIiU4Syj25D0llBGlUKKfDEdefQnCB1P4eU_yUbfg1lnJOoEi8qF1UxgtDBBRCJxzbCHHKj5d-GiW-tbco0ox76kVyk65YmZtx84AuEuBAelryrE9HZqdOrquBGvNorJO-EslvPkhT9cg_qM2ahMXTBMft9kdtCA&sai=AMfl-YTKcP_rg7PDVfdikUaLDPnHFB_kzv8nMO0T48OwTgRrz9im2NI8Gd3erZL4bLQNbO3eS-CtWGcVYQvoSsHeyZEezRC7kNmUXVXPaN52_w&sig=Cg0ArKJSzG4T7jWZQcyNEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:12 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:12 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile1&zMoatRendered=1&zMoatSlotTargetingLoaded=1&zMoatSlotTargetingSet=1&zMoatPageDataTargetingSet=1&zMoatSafetyTargetingSet=1&zMoatEmptySlot=0&zMoatNadoDataLoadTime=262&zMoatAllDataLoadTime=262&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=262&zMoat_YI3=262&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=997744167&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:12 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0018&i2=001882341b24b0f715bfd673b&ep=1569625879&vr=411&id=s9k4qs&dntt=...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0018&i2=001882341b24b0f715bfd673b&ep=1569625879&vr=411&id=s9k4qs&dntt=...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0018&i2=001882341b24b0f715bfd673b&ep=1569625879&vr=411&id=s9k4qs&dntt=0&lt=1543333692495&ev=&cs=w5wn9t&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 002a
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
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 002a
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
Tue, 27 Nov 2018 15:48:12 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.05.0 002a
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
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2FHessen&cb=0018&i2=001882341b24b0f715bfd673b&ep=1569625879&vr=411&id=s9k4qs&dntt=0&lt=1543333692495&ev=&cs=w5wn9t&mo=1&sr=71
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Mon, 27 Nov 2017 15:48:12 GMT
IjvnOpbzskTW
cdn.onthe.io/io.js/
52 KB
17 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
165.227.149.77 New York, United States, ASN14061 (DIGITALOCEAN-ASN - DigitalOcean, LLC, US),
Reverse DNS
Software
nginx/1.14.0 (Ubuntu) /
Resource Hash
04b516116faefd9ae9b6140f709053bfa9bf88e22b8d0b024974cae651ac4be8

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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Tue, 30 Oct 2018 10:29:35 GMT
Server
nginx/1.14.0 (Ubuntu)
ETag
W/"5bd8328f-d191"
Transfer-Encoding
chunked
X-Hostname
cdn-eu-12
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Expires
Wed, 28 Nov 2018 10:31:42 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
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::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
Mon, 05 Nov 2018 21:10:09 GMT
server
Golfe2
age
1492
date
Tue, 27 Nov 2018 15:23:20 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,35"
content-length
17168
expires
Tue, 27 Nov 2018 17:23:20 GMT
RC1142a75d23f543ada46e335898b85c71-source.min.js
assets.adobedtm.com/BL4060cac02a7a4bf1aca763da0a266b4c/
1 KB
995 B
Script
General
Full URL
https://assets.adobedtm.com/BL4060cac02a7a4bf1aca763da0a266b4c/RC1142a75d23f543ada46e335898b85c71-source.min.js
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.211.8.45 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-8-45.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
6a67bc42547f06aeb61a9832ca081333446c516a6269f545d403c07f71822588

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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Mon, 26 Nov 2018 08:42:45 GMT
Server
Apache
ETag
"c5e0ce6ddea1c48c9d0e31eafc2eea65:1543221766"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
577
Expires
Tue, 27 Nov 2018 16:48:12 GMT
s12247174291027
iqdigitalmediamarketinggmbh.sc.omtrdc.net/b/ss/iqdmmgglobalprod/10/JS-v.2.9.0.6.2-L8Z7/
899 B
2 KB
Script
General
Full URL
https://iqdigitalmediamarketinggmbh.sc.omtrdc.net/b/ss/iqdmmgglobalprod/10/JS-v.2.9.0.6.2-L8Z7/s12247174291027?AQB=1&ndh=1&pf=1&callback=s_c_il[1].doPostbacks&et=1&t=27%2F10%2F2018%2015%3A48%3A12%202%200&d.&nsid=0&jsonv=1&.d&mid=89546175901348650360630108714627205959&aamlh=6&ce=UTF-8&pageName=%2F&g=https%3A%2F%2Fwww.golem.de%2F&cc=EUR&ch=D%3Dv8&server=D%3Dv3&events=event1%2Cevent2&aamb=6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y&c1=D%3Dv2&v1=D%3DpageName&c2=D%3Dv3&v2=https%3A%2F%2Fwww.golem.de%2F&v3=www.golem.de&c6=D%3Dv7&c7=D%3Dv8&v7=homepage&v8=homepage&c10=D%3Dv11&v11=non-HUB&c27=D%3Dv28&c28=D%3Dv29&v28=First%20page%20view%20or%20cookies%20not%20supported&c29=D%3Dv30&v29=27.11.2018-15%3A48&v30=1543333692520&c32=D%3Dv33&c33=D%3Dv34&v33=default&v34=%2F&c40=www&c44=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20microsoft%2C%20netscape%2C%20browser%2C%20daily%2C%20headline%2C%20business%2C%20top%2C%20newslink%2C%20newslinks%2C%20stories%2C%20software%2C%20press%20release%2C%20Pressemitteilungen%2C%20Schlagzeilen%2C%20Nachrichten%2C%20deutsch%2C%20neu%2C%20aktuell%2C%20online%2C%20www%2C%20today%2C%20todays%2C%20up-to-date%20news%2C%20fast%20news%2C%20intranet%20news%2C%20world%2C%20international%2C%20german%2C%20financial%2C%20ipo%2C%20business&c45=D%3Dv45&v45=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaft%20%C3%BCber%20Hardware%2C%20Software%2C%20Telekommunikation%2C%20Games&c47=Default&c49=Default&c50=%2F&c51=15&c75=2018-11-26T08%3A42%3A35Z%7Cv.2.9.0.6.2&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&mcorgid=41833DF75A550B4B0A495DA6%40AdobeOrg&AQE=1
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/BL4060cac02a7a4bf1aca763da0a266b4c/EXfba6992d417c4e169fbd5c6ebd3dc7a3-libraryCode_source.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
172.82.228.19 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
*.sc.omtrdc.net
Software
Omniture DC /
Resource Hash
4d686f7f6dff458e7a84bc1317260d4a9b74d35f19c779c95a61131ff1f4d6f9
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

X-AAM-TID
5o85g8hGT+A=
Date
Tue, 27 Nov 2018 15:48:12 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.5.1
P3P
CP="This is not a P3P policy"
Connection
keep-alive
Content-Length
899
X-XSS-Protection
1; mode=block
DCS
dcs-prod-irl1-v012-07a01ab38.edge-irl1.demdex.com 5.44.0.20181114104409 15ms
Pragma
no-cache
Last-Modified
Wed, 28 Nov 2018 15:48:12 GMT
Server
Omniture DC
xserver
www284
ETag
"3314283867064565760-6376640957567217314"
Vary
*
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Expires
Mon, 26 Nov 2018 15:48:12 GMT
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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-113e8"
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
Fri, 28 Dec 2018 15:48:12 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-1e61"
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
Fri, 28 Dec 2018 15:48:12 GMT
the-lion-king-trailer.jpg
video.golem.de/teaser/1/1/22150/thumb-high-1000/
49 KB
50 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22150/thumb-high-1000/the-lion-king-trailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ab09c964090782685ba8d99d63320e82c3fa514d2d9b9fc023f5dbac0c288f24

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Sat, 24 Nov 2018 17:42:25 GMT
Server
nginx
ETag
"5bf98d81-c546"
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
50502
Expires
Fri, 28 Dec 2018 15:48:12 GMT
unbenannt-2.jpg
video.golem.de/teaser/1/1/22146/thumb-high-1000/
42 KB
43 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22146/thumb-high-1000/unbenannt-2.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
0082fe14c386acfd06aded26e1e144327a92044da86c5d174efeda1436b31579

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Mon, 26 Nov 2018 08:37:36 GMT
Server
nginx
ETag
"5bfbb0d0-a8e8"
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
43240
Expires
Fri, 28 Dec 2018 15:48:12 GMT
ipadpro-snap.jpg
video.golem.de/teaser/1/1/22138/thumb-high-1000/
68 KB
68 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22138/thumb-high-1000/ipadpro-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
11df9c12d7e119a6de1ef2f928a41131933d31fa59d062ba63a0f4f72b81e944

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Thu, 22 Nov 2018 09:50:48 GMT
Server
nginx
ETag
"5bf67bf8-10f5a"
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
69466
Expires
Fri, 28 Dec 2018 15:48:12 GMT
the-lego-movie-2-trailer.jpg
video.golem.de/teaser/1/1/22140/thumb-high-1000/
58 KB
58 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/22140/thumb-high-1000/the-lego-movie-2-trailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7384937c810ed8b1f3c2636abadeb7cd6119648fd126b05dc0d5a8bbbb3c2ef0

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Thu, 22 Nov 2018 09:29:17 GMT
Server
nginx
ETag
"5bf676ed-e755"
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
59221
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137922-180162-180161_rc.jpg
www.golem.de/1811/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1811/137922-180162-180161_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
63c28908fa31c62647090210628b113673bee253cd57c0499569bf68cebdce55

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 11:05:06 GMT
Server
nginx
ETag
"5bfd24e2-1f64"
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
8036
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137945-180257-180254_rc.jpg
www.golem.de/1811/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1811/137945-180257-180254_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
4602e984723c771d8eef88cbaf635e5db2becf4780a4d677089bf68244b13d63

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 14:10:05 GMT
Server
nginx
ETag
"5bfd503d-21fe"
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
8702
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137924-180182-180178_rc.jpg
www.golem.de/1811/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1811/137924-180182-180178_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
afaa1039e9c9e8d2e8e849cb497972a4b0b43390bbac8d481e999359a82c151b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 05:46:04 GMT
Server
nginx
ETag
"5bfcda1c-16fb"
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
5883
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137942-180249-180246_rc.jpg
www.golem.de/1811/
10 KB
11 KB
Image
General
Full URL
https://www.golem.de/1811/137942-180249-180246_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
2bb9ffe339a88aed52c775b145bb7200de2f2373a0f524c2564631fb666ba6cd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 13:30:05 GMT
Server
nginx
ETag
"5bfd46dd-29c7"
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
10695
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137926-180174-180171_rc.jpg
www.golem.de/1811/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1811/137926-180174-180171_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
f4a292ea2bfcac61e3294d3eefa6114f519b4e5669dc20d43fb514b97d1f7b33

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 07:07:04 GMT
Server
nginx
ETag
"5bfced18-1b08"
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
6920
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137873-179927-179923_rc.jpg
www.golem.de/1811/
96 KB
97 KB
Image
General
Full URL
https://www.golem.de/1811/137873-179927-179923_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
56564e0e31cd96293fecac7b933eeec3168e0e2d960cccd7c8e1c2a05e19b197

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 23 Nov 2018 09:30:05 GMT
Server
nginx
ETag
"5bf7c89d-18179"
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
98681
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137797-179681-179680_rc.jpg
www.golem.de/1811/
103 KB
103 KB
Image
General
Full URL
https://www.golem.de/1811/137797-179681-179680_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
d5148bf2db30affd91bb278169d81a74c60f27060a0d8d9961b3a58c10769a63

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Wed, 21 Nov 2018 08:09:06 GMT
Server
nginx
ETag
"5bf512a2-19a9b"
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
105115
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137867-179962-179961_rc.jpg
www.golem.de/1811/
10 KB
11 KB
Image
General
Full URL
https://www.golem.de/1811/137867-179962-179961_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
055ca20f7f779ee7a7a2d7f9fa994130b1120da7ed4c76506033d5b03b3b3f02

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 08:01:04 GMT
Server
nginx
ETag
"5bfcf9c0-299b"
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
10651
Expires
Fri, 28 Dec 2018 15:48:12 GMT
133269-157468-157466_rc.jpg
www.golem.de/1803/
5 KB
6 KB
Image
General
Full URL
https://www.golem.de/1803/133269-157468-157466_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
aa2310067af2900a9d6bef7ded9d40cd8a8f620b8e60eb6f01298745c385c5d3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 20 Mar 2018 08:15:05 GMT
Server
nginx
ETag
"5ab0c309-1504"
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
5380
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137325-177553-177550_rc.jpg
www.golem.de/1811/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1811/137325-177553-177550_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
dfbe8961e004e84af6c834063fcd829c59bab8e3904b93d0cd63f5eb215fd862

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Mon, 26 Nov 2018 11:08:04 GMT
Server
nginx
ETag
"5bfbd414-21a1"
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
8609
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137938-180231-180228_rc.jpg
www.golem.de/1811/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1811/137938-180231-180228_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
b35ffa7e9fbf32b23825426337486daf9ed2ebff26a656202cc7dc5dcbd6e182

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 13:00:05 GMT
Server
nginx
ETag
"5bfd3fd5-2476"
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
9334
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137909-180102-180099_rc.jpg
www.golem.de/1811/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1811/137909-180102-180099_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
999fb3d31824ff12dd46136a91e842d59db4103411da7950e21863872aa2fcb1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Mon, 26 Nov 2018 09:59:04 GMT
Server
nginx
ETag
"5bfbc3e8-2578"
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
9592
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137883-179978-179975_rc.jpg
www.golem.de/1811/
11 KB
11 KB
Image
General
Full URL
https://www.golem.de/1811/137883-179978-179975_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
b9a43cb4bbe032b5e3bf828b71d7d5b0a4cddf703a327a5a478ee6c13970d164

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 23 Nov 2018 11:28:04 GMT
Server
nginx
ETag
"5bf7e444-2a3e"
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
10814
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137939-180240-180236_rc.jpg
www.golem.de/1811/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1811/137939-180240-180236_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
45b51b7609f772ed76d38d5617e13adfbacc2e576234d5845c72558be8bca1d6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 12:45:05 GMT
Server
nginx
ETag
"5bfd3c51-174d"
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
5965
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137766-180010-180008_rc.jpg
www.golem.de/1811/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1811/137766-180010-180008_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
041baba733dd9e00f155f0bd1f3fd44ccc1c2afcb5d195c080b75247e66e373f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Mon, 26 Nov 2018 07:03:04 GMT
Server
nginx
ETag
"5bfb9aa8-17f1"
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
6129
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137940-180239-180233_rc.jpg
www.golem.de/1811/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1811/137940-180239-180233_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
16bf55699b231e61b03034b7b6d223670bbd1d39c1dcf393d4e0b683798d302a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 12:17:05 GMT
Server
nginx
ETag
"5bfd35c1-22cd"
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
8909
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137937-180218-180215_rc.jpg
www.golem.de/1811/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1811/137937-180218-180215_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
21df4ace5aa7646581a4705e06d03c93d023f5d265d03f14d12ee471d2861d6e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 12:05:06 GMT
Server
nginx
ETag
"5bfd32f2-24f3"
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
9459
Expires
Fri, 28 Dec 2018 15:48:12 GMT
136108-171534-171531_rc.jpg
www.golem.de/1808/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1808/136108-171534-171531_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
a9e7fb5d534c94e5002bd4e5c8bb4cd41dc25de2e3b0f4dfbc2d53b003609577

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 21 Aug 2018 09:58:03 GMT
Server
nginx
ETag
"5b7be22b-1339"
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
4921
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137931-180202-180199_rc.jpg
www.golem.de/1811/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1811/137931-180202-180199_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
ff7032357e731ba3db793a9e992f06287664f092a3731d38e9cd05b5ccdcb13b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 10:30:05 GMT
Server
nginx
ETag
"5bfd1cad-26c4"
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
9924
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137933-180206-180203_rc.jpg
www.golem.de/1811/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1811/137933-180206-180203_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
8f9e3075a33d7c4cf61ed4384884c4347f10c0d77017c24bb9dfd49ab42954fe

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 10:20:04 GMT
Server
nginx
ETag
"5bfd1a54-26da"
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
9946
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137872-179938-179934_rc.jpg
www.golem.de/1811/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1811/137872-179938-179934_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
a21152f88b2f121e232e77e41c2f2aaec6134e0d97ff898d8d1f92f3752bf51d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 23 Nov 2018 11:01:05 GMT
Server
nginx
ETag
"5bf7ddf1-1df0"
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
7664
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137929-180198-180197_rc.jpg
www.golem.de/1811/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1811/137929-180198-180197_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
ff2a0cfc6a0b2cab1ea140220e289d2b2db9aad7e06ab31bc1dcceea98fddf62

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 10:05:05 GMT
Server
nginx
ETag
"5bfd16d1-173d"
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
5949
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137932-180190-180184_rc.jpg
www.golem.de/1811/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1811/137932-180190-180184_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
c0c4599883d0df3454b2211aecec6d746816bc4c10916a2e59f19ceae08c2c60

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 09:38:04 GMT
Server
nginx
ETag
"5bfd107c-1c28"
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
7208
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137824-179706-179705_rc.jpg
www.golem.de/1811/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1811/137824-179706-179705_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
aa4a8d3186047ca0dacbbc42e303bdc292e16ad07b31d3a6581ac8727720820b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 23 Nov 2018 07:45:04 GMT
Server
nginx
ETag
"5bf7b000-1f5a"
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
8026
Expires
Fri, 28 Dec 2018 15:48:12 GMT
137930-180189-180183_rc.jpg
www.golem.de/1811/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1811/137930-180189-180183_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
e86856dd34dca8070a958897a81d82e58b7b777dcdefd22c4f9a4ccdd8bddc94

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 09:18:04 GMT
Server
nginx
ETag
"5bfd0bcc-1f5f"
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
8031
Expires
Fri, 28 Dec 2018 15:48:12 GMT
133766-159546-159545_rc.jpg
www.golem.de/1804/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1804/133766-159546-159545_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
544d61a5954086f1812071dca3a6b2f60f66862b3b45a508bc61391da9109347

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 10 Apr 2018 14:32:04 GMT
Server
nginx
ETag
"5acccae4-225c"
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
8796
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137786-179498-179496_rc.jpg
www.golem.de/1811/
16 KB
16 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137786-179498-179496_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
cee613af53edabf594bf89b5af409279d2d0e3d2a641eff837d4ffe495299276

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utma=21769261.1978759749.1543333693.1543333693.1543333693.1; __utmb=21769261.0.10.1543333693; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 20 Nov 2018 08:06:06 GMT
Server
nginx
ETag
"5bf3c06e-3f5f"
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
16223
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137422-177973-177971_rc.jpg
www.golem.de/1811/
12 KB
13 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137422-177973-177971_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
de694f5b73923338521a80f7c41622c4395cdfce667ea63dbb24239881087032

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Mon, 19 Nov 2018 11:12:06 GMT
Server
nginx
ETag
"5bf29a86-3146"
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
12614
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137715-179171-179169_rc.jpg
www.golem.de/1811/
15 KB
16 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137715-179171-179169_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
766108dbf2f97de17c3fe9fd539b002c874d396772aa0df3283fc6c077fafa12

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Mon, 19 Nov 2018 14:30:08 GMT
Server
nginx
ETag
"5bf2c8f0-3cde"
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
15582
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137752-179372-179370_rc.jpg
www.golem.de/1811/
24 KB
25 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137752-179372-179370_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
154bccd7107284e456a3f911a5b500b703b5ee8caa4983c269d90fc565054f58

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 16 Nov 2018 13:40:05 GMT
Server
nginx
ETag
"5beec8b5-6191"
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
24977
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137750-179338-179336_rc.jpg
www.golem.de/1811/
25 KB
25 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137750-179338-179336_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
167cbc70ebee688bd24e916da66aa3c570af8a30b151d8c7dd607b8ff24d97b2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 16 Nov 2018 08:04:05 GMT
Server
nginx
ETag
"5bee79f5-6289"
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
25225
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137695-179086-179084_rc.jpg
www.golem.de/1811/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137695-179086-179084_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
a31ff3b4e5c1cb8373ae5a092a6b78c340b8cefc09dcd59045bcd2d41fc9443e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Thu, 22 Nov 2018 08:02:06 GMT
Server
nginx
ETag
"5bf6627e-4e50"
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
20048
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137831-179723-179721_rc.jpg
www.golem.de/1811/
18 KB
18 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137831-179723-179721_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
4f0513682448e2d2daf4bc364cfdd5b8e9a27f90d6292ab71b705da1b155e83b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Wed, 21 Nov 2018 10:12:07 GMT
Server
nginx
ETag
"5bf52f77-4634"
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
17972
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137767-179640-179638_rc.jpg
www.golem.de/1811/
29 KB
29 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137767-179640-179638_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
3de4dc603ae60f8e587845aeb08cc9aee76aaa9db8452c1413f1adfd3edc4102

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Wed, 21 Nov 2018 11:04:08 GMT
Server
nginx
ETag
"5bf53ba8-72ab"
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
29355
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137801-179613-179611_rc.jpg
www.golem.de/1811/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137801-179613-179611_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
71bc184b89d329f7fe79c88d9c2bcbca2369f95308f8535b6af8f35158ecc4c7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 20 Nov 2018 11:03:05 GMT
Server
nginx
ETag
"5bf3e9e9-566b"
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
22123
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137849-179807-179805_rc.jpg
www.golem.de/1811/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137849-179807-179805_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
6d217d1c0c2f8e60d9728b9512ea94a358b000673a9ae41dd3474fd71e67e20d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Wed, 21 Nov 2018 15:44:06 GMT
Server
nginx
ETag
"5bf57d46-5ae9"
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
23273
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137714-179185-179181_rc.jpg
www.golem.de/1811/
13 KB
13 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137714-179185-179181_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
68cb4c14df41eeca7d8cc5fb44d1a3e1b9186b735e6aa3bc915f9412f99ea84a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Thu, 15 Nov 2018 11:01:06 GMT
Server
nginx
ETag
"5bed51f2-3402"
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
13314
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137680-179016-179014_rc.jpg
www.golem.de/1811/
15 KB
15 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137680-179016-179014_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
d8ca962217e5ce12ac4d7d2de6a18d552ceb4d8e1a4a2de58cbd192733fdbbe9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Thu, 15 Nov 2018 08:00:05 GMT
Server
nginx
ETag
"5bed2785-3b60"
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
15200
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137820-179669-179667_rc.jpg
www.golem.de/1811/
24 KB
24 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137820-179669-179667_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
559f4ba86cefc3676ed2b23310a82a9fcee616a399bbfe2436910a9cfdb4dd07

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 20 Nov 2018 15:04:06 GMT
Server
nginx
ETag
"5bf42266-5f3f"
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
24383
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137805-179646-179644_rc.jpg
www.golem.de/1811/
30 KB
30 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137805-179646-179644_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
757ca070863b243bea26c52abecf037c1941018a70f196713cf552aeeabeaec7

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 20 Nov 2018 13:42:05 GMT
Server
nginx
ETag
"5bf40f2d-7819"
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
30745
Expires
Fri, 28 Dec 2018 15:48:12 GMT
sp_137463-178064-178062_rc.jpg
www.golem.de/1811/
31 KB
32 KB
Image
General
Full URL
https://www.golem.de/1811/sp_137463-178064-178062_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
1d89573c5259012cba5eed5e7d9ee5c1daf0738d027c19769e88393d97257fd5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Mon, 12 Nov 2018 11:03:06 GMT
Server
nginx
ETag
"5be95dea-7dd0"
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
32208
Expires
Fri, 28 Dec 2018 15:48:12 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1543333693&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:182 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adb_dslv=1543333692531; s_cc=true
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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 15:48:12 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
ads
securepubads.g.doubleclick.net/gampad/
24 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=981923346057591&correlator=885489351718910&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21062452&vrg=275&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile8%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Clit29615%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26iqadtype%3Donline%26tile%3D8%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie=ID%3Dfa685e5bddc8c7ad%3AT%3D1543333692%3AS%3DALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg&cookie_enabled=1&bc=15&abxe=1&lmt=1543333692&dt=1543333692601&dlt=1543333691366&idt=884&frm=20&biw=1585&bih=1200&oid=3&adx=993&ady=880&adk=1289509276&uci=5&gut=v2&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=75&icsg=565149681336064&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x384&msz=99x1&psts=CiYIz_6G5RFIja0DeAHoAcKDhP-CBIAClaf9AYAC9cj9AYAC_bGpAg&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
9929178d3ef84192348fc6263feefdd22794a16a8a6b70d4e5d8d9e85fdf1f2a
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
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
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,35"
content-length
6577
x-xss-protection
1; mode=block
google-lineitem-id
4550223008
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
85376452645
content-type
text/javascript; 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
ads
securepubads.g.doubleclick.net/gampad/
21 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=981923346057591&correlator=885489351718910&output=json_html&callback=googletag.impl.pubads.callbackProxy6&impl=fif&adsid=NT&eid=21062452&vrg=275&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776&sc=1&sfv=1-0-31&iu=%2F183%2Fgolem%2Fhomepage&sz=99x1%7C1000x500%7C1000x333%7C1000x250%7C1000x167%7C1000x125%7C1000x100%7C970x90%7C800x250%7C970x250%7C970x90%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile4%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Clit29615%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26iqadtype%3Donline%26tile%3D4%26m_mv%3D60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe%26m_mv%3DdataAvailable%26m_gv%3DdataAvailable&cookie=ID%3Dfa685e5bddc8c7ad%3AT%3D1543333692%3AS%3DALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg&cookie_enabled=1&bc=15&abxe=1&lmt=1543333692&dt=1543333692613&dlt=1543333691366&idt=884&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=1273&adk=780685045&uci=6&gut=v2&ifi=6&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=75&icsg=565149681336064&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x16&msz=99x1&psts=CiYIz_6G5RFIja0DeAHoAcKDhP-CBIAClaf9AYAC9cj9AYAC_bGpAg&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-in-f2.1e100.net
Software
cafe /
Resource Hash
e77d504ae0f3d20331cde98903c5491f120f31db02d4270fdb76b7ee98082bfe
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
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
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,35"
content-length
6219
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235188476
content-type
text/javascript; 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
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
52.212.57.107 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-212-57-107.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.5 /
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
Sun, 25 Nov 2018 11:14:14 GMT
Content-Encoding
gzip
Last-Modified
Sun, 25 Nov 2018 11:13:58 GMT
Server
akka-http/10.1.5
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
m
p.yieldlab.net/
0
336 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=21719&ext_id=BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr&ddata_seg=e0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
85.114.144.194 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
lb.yieldlab.net
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
Tue, 27 Nov 2018 15:48:12 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
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Mon, 26 Nov 2018 15:48:12 GMT
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000719061648120149&axd_pid=22&axd_fuid=BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr
43 B
717 B
Image
General
Full URL
https://xpl.theadex.com/d/327/i/2.gif?_sc=1000719061648120149&axd_pid=22&axd_fuid=BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr
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
89.163.159.116 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx
P3P
CP="CAO PSA OUR"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Transfer-Encoding
binary
Connection
keep-alive
Access-Control-Allow-Credentials
true
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Date
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"
Location
https://xpl.theadex.com:443/d/327/i/2.gif?_sc=1000719061648120149&axd_pid=22&axd_fuid=BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=UTF-8
a.js
d.df-srv.de/match/
Redirect Chain
  • https://d.df-srv.de/match/a.js?pid=42
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25
  • https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6628567733988423701
3 B
466 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6628567733988423701
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
2001:16e0:10a:1::c2:1 , Germany, ASN12611 (RKOM R-KOM Regensburger Telekommunikations GmbH & Co. KG, DE),
Reverse DNS
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

Pragma
no-cache
Date
Tue, 27 Nov 2018 15:47:49 GMT
Server
nginx
P3P
CP="Contact Impact does not have a P3P policy.
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Type
application/javascript; charset=utf-8
Content-Length
3
Expires
0

Redirect headers

Location
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6628567733988423701
Date
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx
Connection
keep-alive
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Transfer-Encoding
chunked
Expires
Thu, 01 Jan 1970 00:00:00 GMT
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=597865348&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...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1186514941.1543333692&jid=1691580632&_v=5.7.2&z=597865348
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=1186514941.1543333692&jid=1691580632&_v=5.7.2&z=597865348
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:400c:c0c::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
date
Tue, 27 Nov 2018 15:48:12 GMT
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Tue, 27 Nov 2018 15:48:12 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1186514941.1543333692&jid=1691580632&_v=5.7.2&z=597865348
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
368
expires
Fri, 01 Jan 1990 00:00:00 GMT
ibs:dpid=385489&dpuuid=6628567733988423701
dpm.demdex.net/
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fdpm.demdex.net%2Fibs%3Adpid%3D385489%26dpuuid%3D%25%25COOKIE%25%25
  • https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6628567733988423701
42 B
769 B
Image
General
Full URL
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6628567733988423701
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.194.108.5 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-108-5.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

DCS
dcs-prod-irl1-v012-02f1c9b8b.edge-irl1.demdex.com 5.44.0.20181114104409 3ms
Pragma
no-cache
X-TID
GZxidRphTw4=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Location
https://dpm.demdex.net/ibs:dpid=385489&dpuuid=6628567733988423701
Date
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx
Connection
keep-alive
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Transfer-Encoding
chunked
Expires
Thu, 01 Jan 1970 00:00:00 GMT
2.gif
dmp.theadex.com/d/226/i/
Redirect Chain
  • https://dpm.demdex.net/ibs:dpid=78959&redir=https%3A%2F%2Fdmp.theadex.com%2Fd%2F226%2Fi%2F2.gif%3Faxd_pid%3D97%26axd_fuid%3D%25DID%25
  • https://dmp.theadex.com/d/226/i/2.gif?axd_pid=97&axd_fuid=89801360581190805020604735665356488189
43 B
717 B
Image
General
Full URL
https://dmp.theadex.com/d/226/i/2.gif?axd_pid=97&axd_fuid=89801360581190805020604735665356488189
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
85.114.144.107 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Tue, 27 Nov 2018 15:48:13 GMT
Server
nginx
P3P
CP="CAO PSA OUR"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Transfer-Encoding
binary
Connection
keep-alive
Access-Control-Allow-Credentials
true
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Pragma
no-cache
X-TID
Rz8L3pgjRrE=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Location
https://dmp.theadex.com/d/226/i/2.gif?axd_pid=97&axd_fuid=89801360581190805020604735665356488189
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:00 GMT
sp_r4j4-591427-i_rc.jpg
www.golem.de/2001/
68 B
486 B
Image
General
Full URL
https://www.golem.de/2001/sp_r4j4-591427-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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693
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
Tue, 27 Nov 2018 15:48:12 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
/
iqdigital.demdex.net/event/
42 B
629 B
Image
General
Full URL
https://iqdigital.demdex.net/event/?d_cid_ic=emetriq%01BSa8BsBsBswZBD_8Wsf-BiUABifkBDf0WsfABifABifABfrr%010
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.49.41.66 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-49-41-66.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

DCS
dcs-prod-irl1-v012-0dc8c1dec.edge-irl1.demdex.com 5.44.0.20181114104409 13ms
Pragma
no-cache
X-TID
i5gSX59BRNE=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 760C
262 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
708e35f846bc89ecb31ef93fbe98fee0c40e80e394732ba020d3cda631d7730b

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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Wed, 14 Nov 2018 17:30:08 GMT
Server
AmazonS3
x-amz-request-id
273E12844467B903
ETag
"f34e886d014714d6db71cfc621ce64f2"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=57852
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82736
x-amz-id-2
xvRbPoVs4Nq4eoBChMZ7pwceS9eB1Pi0TP8dlSTu6Ou8PdetOMmexG+loo7iJpJ8H6Npon9oYZM=
/
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:3fc5938be.27b12d9f9_1543333692774,cdn_version:4]&s=6acc7c777cce3be138a245218c439c54&1543333692777
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.114.52 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.52.114.40.188.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
Tue, 27 Nov 2018 15:48:12 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT
/
tt.onthe.io/uniques/
33 B
515 B
Script
General
Full URL
https://tt.onthe.io/uniques/?current=27&holding=108810e7aaccba71ff5759d480adc9d0&hash_user=3fc5938be.27b12d9f9_1543333692774&1543333692779
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.114.52 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.52.114.40.188.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
Tue, 27 Nov 2018 15:48:12 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:3fc5938be.27b12d9f9_1543333692774,cdn_version:4]&s=6acc7c777cce3be138a245218c439c54&__io=3fc5938be.27b12d9f9_1543333692774&1543333692781
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.114.52 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.52.114.40.188.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
Tue, 27 Nov 2018 15:48:12 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:3fc5938be.27b12d9f9_1543333692774,cdn_version:4]&s=6acc7c777cce3be138a245218c439c54&1543333692783
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.114.52 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.52.114.40.188.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
Tue, 27 Nov 2018 15:48:12 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
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/
202 KB
75 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
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
355a899a6c3edc08b2518330f70df73c1ac8a2e6b8ab241c75c63cdecb691b9e
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
Tue, 27 Nov 2018 15:48:12 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
76459
x-xss-protection
1; mode=block
server
cafe
etag
7163956351494980007
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:12 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/ Frame 4DA7
202 KB
75 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
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
355a899a6c3edc08b2518330f70df73c1ac8a2e6b8ab241c75c63cdecb691b9e
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
Tue, 27 Nov 2018 15:48:12 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
76459
x-xss-protection
1; mode=block
server
cafe
etag
7163956351494980007
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:12 GMT
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
245 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::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
Tue, 27 Nov 2018 15:15:18 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 26 Nov 2018 21:47:25 GMT
server
sffe
age
1974
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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
125
x-xss-protection
1; mode=block
expires
Wed, 28 Nov 2018 03:15:18 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
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
Tue, 27 Nov 2018 15:48:12 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
737
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
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
Tue, 27 Nov 2018 15:48:12 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
736
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
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
Tue, 27 Nov 2018 15:48:12 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
735
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
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
Tue, 27 Nov 2018 15:48:12 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
734
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
rmpslider-rl_122-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_122-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
f070a404ffa3b35fb0636c3172879da6e87e3703bdb7b225c1872aec5a201c5e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; __gads=ID=fa685e5bddc8c7ad:T=1543333692:S=ALNI_MbVJ8bTjtL2BRczN-FyaZEPChPTmg; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693; __io_d=1_705468254; __io_lv=1543333692774; __io=3fc5938be.27b12d9f9_1543333692774; __io_unique_43098=27; __io_uh=1; __io_visit_43098=1; golem_us=9da0cc84; golem_uv=9da0cc84; golem_uz=9da0cc84
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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Fri, 07 Sep 2018 13:23:44 GMT
Server
nginx
ETag
W/"5b927be0-407e"
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
Fri, 28 Dec 2018 15:48:12 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/ Frame 90F3
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
106c5562d37543e0d9505b8b75c787eaeaa2ee08a99f9f385568f565b0444afb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 14:32:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
4556
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27325
x-xss-protection
1; mode=block
server
cafe
etag
2726007002868826454
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 11 Dec 2018 14:32:16 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 90F3
262 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
708e35f846bc89ecb31ef93fbe98fee0c40e80e394732ba020d3cda631d7730b

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
Tue, 27 Nov 2018 15:48:12 GMT
Content-Encoding
gzip
Last-Modified
Wed, 14 Nov 2018 17:30:08 GMT
Server
AmazonS3
x-amz-request-id
273E12844467B903
ETag
"f34e886d014714d6db71cfc621ce64f2"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=57852
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82736
x-amz-id-2
xvRbPoVs4Nq4eoBChMZ7pwceS9eB1Pi0TP8dlSTu6Ou8PdetOMmexG+loo7iJpJ8H6Npon9oYZM=
truncated
/ Frame 90F3
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c022284176affb7b8875b60c2d6aadfa8905c92cbd2f790eb080ecebab96c0c2

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 90F3
0
128 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsveUff9uF6217xXFo-mDryxk5CSWmw7jefM7lsez-YWV7Vgd3jhWkt9I85ObHW_yP5FztR5-ZonZsZEJtR1igHaCk0C8c7kME6zUv7T1nxbZPmqEFSJbkPOA9vSFGyxU4wdPA4QCNRV-G1_Ddq9Aki_pFlAoYti8C5L5a_bKKC73hmSGWHiAcPUP7gDZy3Eo9PVadEQt8SM2EkVWVdLWUTn7c3PxtwUnYBAMO6pD5u1BQ2nvqblDXeIqKdHdQ&sai=AMfl-YTTkYLaIZTlenDBd5hM7Sn9WEAyoveHPzKx0E8-pdZmYfFnypx9_m1fhv1pTNG2Y7adsm1ydK_8jscoI7wInI9daU8Kl7-TmP0tjJZ_&sig=Cg0ArKJSzHCaIlamDYVkEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:12 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:12 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile3&zMoatRendered=2&zMoatSlotTargetingLoaded=2&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=2&zMoatSafetyTargetingSet=2&zMoatEmptySlot=0&zMoatNadoDataLoadTime=262&zMoatAllDataLoadTime=262&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=262&zMoat_YI3=262&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=575048890&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:12 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:12 GMT
activation
adstax-match.adrtx.net/ Frame E4C5
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.213.21.157 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-213-21-157.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.5 /
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
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
Tue, 27 Nov 2018 15:48:13 GMT
Server
akka-http/10.1.5
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/ Frame C7F8
74 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
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
8311bc3a855c02e96954acba57ca59878afff0d519b0a161df0e75f95f49fe4a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 15:48:12 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27972
x-xss-protection
1; mode=block
server
cafe
etag
800816325515767930
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:12 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/ Frame C7F8
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
106c5562d37543e0d9505b8b75c787eaeaa2ee08a99f9f385568f565b0444afb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 14:32:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
4556
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27325
x-xss-protection
1; mode=block
server
cafe
etag
2726007002868826454
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 11 Dec 2018 14:32:16 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame C7F8
262 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
708e35f846bc89ecb31ef93fbe98fee0c40e80e394732ba020d3cda631d7730b

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
Tue, 27 Nov 2018 15:48:13 GMT
Content-Encoding
gzip
Last-Modified
Wed, 14 Nov 2018 17:30:08 GMT
Server
AmazonS3
x-amz-request-id
273E12844467B903
ETag
"f34e886d014714d6db71cfc621ce64f2"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=57851
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82736
x-amz-id-2
xvRbPoVs4Nq4eoBChMZ7pwceS9eB1Pi0TP8dlSTu6Ou8PdetOMmexG+loo7iJpJ8H6Npon9oYZM=
truncated
/ Frame C7F8
210 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6f6cee6f6abd156a1dd2fe5891d12ecdb65d18ec8dfe32bd83451f6c08a4a95e

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame C7F8
0
56 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss9IogQzSJVIuUbFbY_0OfCcj73HfpSUdPSTvSRN3ZgdTC9eGZW5W9xRe_rFksEfiUoxj1lJy9r3aWu8Z81J12kqlp9ajFRQzlCvvnAP34b7Ia_Vvnm3hrebVAwKfj4pZirbxgh-56tQyaeH2r61FzgC8vgjMV38d_AMGXLjHOcH089wskIvPPpRdynD-uiKxHr0mtmQzEIWR8DgTf2XdM4rgtc3xNzQ82Mh1iZ3SJLwTJz-ySEf1CRqDpMxdx2wQ&sai=AMfl-YRbHcmnEswlACrwpfMoL-AIVNWxYfvJTY75Mp-BmY5sPNYf3-2184M-5V0atEUq3kmUE7jsmaa68IwPYsy9BZVbo9yralx4ItPxmMsS0g&sig=Cg0ArKJSzIBHzd0v2pQMEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
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
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.164.213 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
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
Tue, 27 Nov 2018 15:48:14 GMT
Last-Modified
Tue, 27 Nov 2018 15:04:04 GMT
Server
AmazonS3
x-amz-request-id
46C8E7BB3F685A54
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
nUwVa/uLHge9iWQB5VwV0pjNZXPclQ3uFVHovBeOhdSTu9JwF2pmk2qK68HarVYAE1WR9e4Z3BU=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 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
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CvVersion%7C3.3.0; adbErrors=; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693; __io_d=1_705468254; __io_lv=1543333692774; __io=3fc5938be.27b12d9f9_1543333692774; __io_unique_43098=27; __io_uh=1; __io_visit_43098=1; golem_us=9da0cc84; golem_uv=9da0cc84; golem_uz=9da0cc84; AAMC_iqdigital_0=REGION%7C6; aam_uuid=89801360581190805020604735665356488189; __gads=ID=b00f9a0fe1834f13:T=1543333692:S=ALNI_MZG_TRSp8m9hB_jlUWiu2lnw_nGfQ
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
Tue, 27 Nov 2018 15:48:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-5e9f0"
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
Fri, 28 Dec 2018 15:48:13 GMT
publishertag.prebid.js
static.criteo.net/js/ld/
35 KB
12 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.prebid.js
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid29082018.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.0.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
f8a3399e4886015e3fa0fe1be7adda872ea163f264618713c4d117737dd58a85

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
Tue, 27 Nov 2018 15:48:13 GMT
Content-Encoding
gzip
Last-Modified
Wed, 19 Sep 2007 08:50:25 GMT
Server
nginx
ETag
W/"5bd8782b-8dfc"
Transfer-Encoding
chunked
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400, public
Connection
keep-alive
Timing-Allow-Origin
*
Expires
Wed, 28 Nov 2018 15:48:13 GMT
sp_r4j4-416771-i_rc.jpg
www.golem.de/9134/microads/
68 B
486 B
Image
General
Full URL
https://www.golem.de/9134/microads/sp_r4j4-416771-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
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; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693; __io_d=1_705468254; __io_lv=1543333692774; __io=3fc5938be.27b12d9f9_1543333692774; __io_unique_43098=27; __io_uh=1; __io_visit_43098=1; golem_us=9da0cc84; golem_uv=9da0cc84; golem_uz=9da0cc84; AAMC_iqdigital_0=REGION%7C6; aam_uuid=89801360581190805020604735665356488189; __gads=ID=b00f9a0fe1834f13:T=1543333692:S=ALNI_MZG_TRSp8m9hB_jlUWiu2lnw_nGfQ; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CMCSYNCSOP%7C411-17870%7CvVersion%7C3.3.0
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
Tue, 27 Nov 2018 15:48:13 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
integrator.js
adservice.google.de/adsid/ Frame C7F8
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/ Frame C7F8
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81d::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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/ Frame C7F8
202 KB
75 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
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
355a899a6c3edc08b2518330f70df73c1ac8a2e6b8ab241c75c63cdecb691b9e
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
Tue, 27 Nov 2018 15:48:13 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
76459
x-xss-protection
1; mode=block
server
cafe
etag
7163956351494980007
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:13 GMT
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
924 B
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.png
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.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
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693; __io_d=1_705468254; __io_lv=1543333692774; __io=3fc5938be.27b12d9f9_1543333692774; __io_unique_43098=27; __io_uh=1; __io_visit_43098=1; golem_us=9da0cc84; golem_uv=9da0cc84; golem_uz=9da0cc84; AAMC_iqdigital_0=REGION%7C6; aam_uuid=89801360581190805020604735665356488189; __gads=ID=b00f9a0fe1834f13:T=1543333692:S=ALNI_MZG_TRSp8m9hB_jlUWiu2lnw_nGfQ; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CMCSYNCSOP%7C411-17870%7CvVersion%7C3.3.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-39c"
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
924
Expires
Fri, 28 Dec 2018 15:48:13 GMT
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
1 KB
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-mit-werbung3.png
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.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
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; adbErrors=; adbScroll=; adb_dslv=1543333692531; s_cc=true; adp_segs=e0; __utmc=21769261; __utmz=21769261.1543333693.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utma=21769261.1186514941.1543333692.1543333692.1543333692.1; __utmb=21769261.1.10.1543333693; __io_d=1_705468254; __io_lv=1543333692774; __io=3fc5938be.27b12d9f9_1543333692774; __io_unique_43098=27; __io_uh=1; __io_visit_43098=1; golem_us=9da0cc84; golem_uv=9da0cc84; golem_uz=9da0cc84; AAMC_iqdigital_0=REGION%7C6; aam_uuid=89801360581190805020604735665356488189; __gads=ID=b00f9a0fe1834f13:T=1543333692:S=ALNI_MZG_TRSp8m9hB_jlUWiu2lnw_nGfQ; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-1303530583%7CMCIDTS%7C17863%7CMCMID%7C89546175901348650360630108714627205959%7CMCAAMLH-1543938492%7C6%7CMCAAMB-1543938492%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1543340892s%7CNONE%7CMCSYNCSOP%7C411-17870%7CvVersion%7C3.3.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-44b"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
1099
Expires
Fri, 28 Dec 2018 15:48:13 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/ Frame 2D02
202 KB
75 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
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
355a899a6c3edc08b2518330f70df73c1ac8a2e6b8ab241c75c63cdecb691b9e
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
Tue, 27 Nov 2018 15:48:13 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
76459
x-xss-protection
1; mode=block
server
cafe
etag
7163956351494980007
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:13 GMT
ca-pub-6583763995580712.js
pagead2.googlesyndication.com/pub-config/r20160913/ Frame C7F8
68 B
179 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
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
Tue, 27 Nov 2018 14:06:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
age
6081
content-type
text/javascript
status
200
cache-control
public, max-age=43200
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
88
x-xss-protection
1; mode=block
expires
Wed, 28 Nov 2018 02:06:52 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43067:uniques_holding&s=6acc7c777cce3be138a245218c439c54&__io=3fc5938be.27b12d9f9_1543333692774&1543333693093
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.114.52 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.52.114.40.188.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
Tue, 27 Nov 2018 15:48:13 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
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile9&zMoatRendered=3&zMoatSlotTargetingLoaded=3&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=3&zMoatSafetyTargetingSet=3&zMoatEmptySlot=0&zMoatNadoDataLoadTime=262&zMoatAllDataLoadTime=262&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=262&zMoat_YI3=262&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=47900905&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:13 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
313 B
979 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.67 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-67.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
45a04c7005bb41f2314b6009e60eac10dd0391def8420cac4401442355e09c82

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
Tue, 27 Nov 2018 09:04:13 GMT
Via
1.1 d7524ff4a82155dd51a24800cf39deec.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
4
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
313
Last-Modified
Tue, 27 Nov 2018 09:03:20 GMT
Server
AmazonS3
ETag
"55bcf02ab6886a2e1347ccbc31cbb561"
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
pzRb3tJMpyUpFFHl7Rd5PxW6Mpp47s_KvOfry7gQlS0Q8z9IwCoKSg==
Expires
0
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/ Frame 4A9E
74 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
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
8311bc3a855c02e96954acba57ca59878afff0d519b0a161df0e75f95f49fe4a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 15:48:12 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27972
x-xss-protection
1; mode=block
server
cafe
etag
800816325515767930
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:12 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/ Frame 4A9E
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
106c5562d37543e0d9505b8b75c787eaeaa2ee08a99f9f385568f565b0444afb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 14:32:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
4556
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27325
x-xss-protection
1; mode=block
server
cafe
etag
2726007002868826454
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 11 Dec 2018 14:32:16 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 4A9E
262 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
708e35f846bc89ecb31ef93fbe98fee0c40e80e394732ba020d3cda631d7730b

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
Tue, 27 Nov 2018 15:48:13 GMT
Content-Encoding
gzip
Last-Modified
Wed, 14 Nov 2018 17:30:08 GMT
Server
AmazonS3
x-amz-request-id
273E12844467B903
ETag
"f34e886d014714d6db71cfc621ce64f2"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=57851
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82736
x-amz-id-2
xvRbPoVs4Nq4eoBChMZ7pwceS9eB1Pi0TP8dlSTu6Ou8PdetOMmexG+loo7iJpJ8H6Npon9oYZM=
truncated
/ Frame 4A9E
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
03f7576a535f8dc268a06336eff96c54762adb8c86be763c53cd2958146af91d

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 4A9E
0
151 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstDqE6reF3lHkkPNmAf6kK7Z2fdtwv0tF4dvDNApVxTsK8uOwrh-WaEWj-SN4eTKD3w0sOdESLepJjFGWEQAKKPlQU_jq8dLPp9QEO8dnm-hOOGje1Ks2ghSe1ehBp7WjeDMc1yjFuue-V8c78XViKSUUg2be51nKMse6Kj-NzbX-pXYFcdXOfe--JdfCZTv2L9qEH3RU8LDd3FEcN9EyheiPP6toKNCrNs8j4FcWPnzqRG9C_HhNzPZe0lhskFaw&sai=AMfl-YTikQQAdKOE43B9Si7poq86EqGx7S_hHfvRhYVuXAaMrMF5AOH71SdkV8Sp76zxEFdHZuW5Sa3ndS5g645aPpmNkkf-Qw2mplJvUbRXYw&sig=Cg0ArKJSzB8uz8jxfzRtEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:13 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/ Frame 34E5
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/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:821::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/r20181107/r20180604/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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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, 27 Nov 2018 13:57:31 GMT
expires
Tue, 11 Dec 2018 13:57:31 GMT
content-type
text/html; charset=UTF-8
etag
12810928231326100212
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6940
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
6642
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
ads
googleads.g.doubleclick.net/pagead/ Frame 0EB0
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=1543333693&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=1543333692792&bpp=14&bdt=1426&fdt=409&idt=405&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&correlator=6405723172870&frm=20&pv=2&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=4255&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=7&uci=7.gdywhbt36lx1&fsb=1&xpc=VHErRYnwdV&p=https%3A//www.golem.de&dtd=451
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:821::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=1543333693&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=1543333692792&bpp=14&bdt=1426&fdt=409&idt=405&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&correlator=6405723172870&frm=20&pv=2&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=4255&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=7&uci=7.gdywhbt36lx1&fsb=1&xpc=VHErRYnwdV&p=https%3A//www.golem.de&dtd=451
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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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
gzip
date
Tue, 27 Nov 2018 15:48:13 GMT
server
cafe
cache-control
private
content-length
10671
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
integrator.js
adservice.google.de/adsid/ Frame 4A9E
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/ Frame 4A9E
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81d::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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/ Frame 4A9E
202 KB
75 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
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
355a899a6c3edc08b2518330f70df73c1ac8a2e6b8ab241c75c63cdecb691b9e
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
Tue, 27 Nov 2018 15:48:13 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
76459
x-xss-protection
1; mode=block
server
cafe
etag
7163956351494980007
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:13 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/ Frame B897
202 KB
75 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
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
355a899a6c3edc08b2518330f70df73c1ac8a2e6b8ab241c75c63cdecb691b9e
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
Tue, 27 Nov 2018 15:48:13 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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
76459
x-xss-protection
1; mode=block
server
cafe
etag
7163956351494980007
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 27 Nov 2018 15:48:13 GMT
ca-pub-6583763995580712.js
pagead2.googlesyndication.com/pub-config/r20160913/ Frame 4A9E
68 B
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 14:06:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
age
6081
content-type
text/javascript
status
200
cache-control
public, max-age=43200
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
88
x-xss-protection
1; mode=block
expires
Wed, 28 Nov 2018 02:06:52 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/
189 KB
52 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=sXPxHDLehj
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.67 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-67.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
bcbb7f7a45bda0445c0f861217bd4766f126d88e6f005f749df8a6e997a40f96

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
Thu, 15 Nov 2018 14:45:12 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
46
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Thu, 15 Nov 2018 14:44:00 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 d7524ff4a82155dd51a24800cf39deec.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
LQ8hIWFQt9wIxlcZVtY-zk77Tpq18NI8NidmTlB6cvTObUdIXJdcwA==
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/ Frame C695
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/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:821::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/r20181107/r20180604/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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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, 27 Nov 2018 13:57:31 GMT
expires
Tue, 11 Dec 2018 13:57:31 GMT
content-type
text/html; charset=UTF-8
etag
12810928231326100212
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6940
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
6642
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
ads
googleads.g.doubleclick.net/pagead/ Frame EC2A
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=1543333693&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=1543333692806&bpp=6&bdt=1439&fdt=499&idt=391&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=6405723172870&frm=20&pv=1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=4998&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=8&uci=8.es833sh6jb0x&fsb=1&xpc=h6NQ0X1ZfR&p=https%3A//www.golem.de&dtd=507
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:821::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=1543333693&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=1543333692806&bpp=6&bdt=1439&fdt=499&idt=391&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120&correlator=6405723172870&frm=20&pv=1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=4998&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=8&uci=8.es833sh6jb0x&fsb=1&xpc=h6NQ0X1ZfR&p=https%3A//www.golem.de&dtd=507
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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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
gzip
date
Tue, 27 Nov 2018 15:48:13 GMT
server
cafe
cache-control
private
content-length
10654
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile16&zMoatRendered=4&zMoatSlotTargetingLoaded=4&zMoatSlotTargetingSet=4&zMoatPageDataTargetingSet=4&zMoatSafetyTargetingSet=4&zMoatEmptySlot=0&zMoatNadoDataLoadTime=262&zMoatAllDataLoadTime=262&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=262&zMoat_YI3=262&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1135938142&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:13 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/ Frame FB1A
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/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:821::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/r20181107/r20180604/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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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, 27 Nov 2018 13:57:31 GMT
expires
Tue, 11 Dec 2018 13:57:31 GMT
content-type
text/html; charset=UTF-8
etag
12810928231326100212
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6940
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
6642
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
ads
googleads.g.doubleclick.net/pagead/ Frame E4E9
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=1543333693&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=1543333692812&bpp=13&bdt=1446&fdt=592&idt=385&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=6405723172870&frm=20&pv=1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=5729&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=9&uci=9.vdpd0mqq54cy&fsb=1&xpc=QlY3qhP4ur&p=https%3A//www.golem.de&dtd=605
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:821::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=1543333693&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=1543333692812&bpp=13&bdt=1446&fdt=592&idt=385&shv=r20181107&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=520x120%2C520x120&correlator=6405723172870&frm=20&pv=1&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=186515157&ga_fc=1&iag=0&icsg=565149681336064&dssz=87&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=5729&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853&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=9&uci=9.vdpd0mqq54cy&fsb=1&xpc=QlY3qhP4ur&p=https%3A//www.golem.de&dtd=605
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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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
gzip
date
Tue, 27 Nov 2018 15:48:13 GMT
server
cafe
cache-control
private
content-length
10701
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/ Frame D7B4
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/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:821::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/r20181107/r20180604/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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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, 27 Nov 2018 13:57:31 GMT
expires
Tue, 11 Dec 2018 13:57:31 GMT
content-type
text/html; charset=UTF-8
etag
12810928231326100212
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6940
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
6642
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
ads
googleads.g.doubleclick.net/pagead/ Frame 58CA
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=8574733096&adk=667898199&adf=3902893106&w=300&guci=1.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&avail_w=0&wgl=1&adsid=NT&dt=1543333693056&bpp=24&bdt=632&fdt=399&idt=396&shv=r20181107&cbv=r20180604&saldr=aa&correlator=6405723172870&frm=23&ife=4&pv=2&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=1382438205&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=993&ady=3918&biw=1585&bih=1200&isw=300&ish=250&ifk=1933803164&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=2&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C300%2C250&vis=1&rsz=o%7Co%7CeEbr%7C&abl=NS&ppjl=u&pfx=0&fu=20&bc=15&osw_key=1990427054&ifi=1&uci=1.ssy9wg2utked&fsb=1&dtd=409
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:821::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-6583763995580712&output=html&h=250&slotname=8574733096&adk=667898199&adf=3902893106&w=300&guci=1.2.0.0.2.2.0.0&format=300x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&avail_w=0&wgl=1&adsid=NT&dt=1543333693056&bpp=24&bdt=632&fdt=399&idt=396&shv=r20181107&cbv=r20180604&saldr=aa&correlator=6405723172870&frm=23&ife=4&pv=2&ga_vid=1186514941.1543333692&ga_sid=1543333692&ga_hid=1382438205&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&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=993&ady=3918&biw=1585&bih=1200&isw=300&ish=250&ifk=1933803164&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=2&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C300%2C250&vis=1&rsz=o%7Co%7CeEbr%7C&abl=NS&ppjl=u&pfx=0&fu=20&bc=15&osw_key=1990427054&ifi=1&uci=1.ssy9wg2utked&fsb=1&dtd=409
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
cookie
IDE=AHWqTUmWKKyl904vRHIP-rKmvXxfnDwcOYKcn-Cz4j2AoBdr8BrlBTesoxjdQ5Qp
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
gzip
date
Tue, 27 Nov 2018 15:48:13 GMT
server
cafe
cache-control
private
content-length
17570
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
osd.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20100101/ Frame C7F8
74 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20100101/osd.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Protocol
SPDY
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
e9cf77edb95978fa6b193724ee40fde091368427e030fed8735cdef6b1a35535
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
Mon, 26 Nov 2018 15:43:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
86705
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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27460
x-xss-protection
1; mode=block
server
cafe
etag
5000825381819961729
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 10 Dec 2018 15:43:08 GMT
/
golem.whitepaperdb.de/ Frame 43C8
0
0
Document
General
Full URL
https://golem.whitepaperdb.de/?tag=golem
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.138.242.228 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
mail.whitepaperdb.de
Software
nginx / PHP/7.0.32 PleskLin
Resource Hash

Request headers

:method
GET
:authority
golem.whitepaperdb.de
:scheme
https
:path
/?tag=golem
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
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
server
nginx
date
Tue, 27 Nov 2018 15:48:13 GMT
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
x-powered-by
PHP/7.0.32 PleskLin
set-cookie
WIDS=3761
content-encoding
gzip
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/ Frame DE6A
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
106c5562d37543e0d9505b8b75c787eaeaa2ee08a99f9f385568f565b0444afb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 14:32:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
4556
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27325
x-xss-protection
1; mode=block
server
cafe
etag
2726007002868826454
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 11 Dec 2018 14:32:16 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame DE6A
262 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
708e35f846bc89ecb31ef93fbe98fee0c40e80e394732ba020d3cda631d7730b

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
Tue, 27 Nov 2018 15:48:13 GMT
Content-Encoding
gzip
Last-Modified
Wed, 14 Nov 2018 17:30:08 GMT
Server
AmazonS3
x-amz-request-id
273E12844467B903
ETag
"f34e886d014714d6db71cfc621ce64f2"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=57851
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82736
x-amz-id-2
xvRbPoVs4Nq4eoBChMZ7pwceS9eB1Pi0TP8dlSTu6Ou8PdetOMmexG+loo7iJpJ8H6Npon9oYZM=
truncated
/ Frame DE6A
212 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
5d0ba145cad4df5f63f2b7536dc6ad15727f54ce8c1d1e5a51a38a7f57907d96

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame DE6A
0
141 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsstnHrDaVPILr0BOg643oeTeMA5Y6SBdMb3XmdpUIaFKVEfCNGdOT1vSXTM5-CkMxLq-AjNqOTJrat-JcSWEPd-Zavnf2hGwuNA4LKB0PrmpUJdJDdn7ERp6-y-0MDB_vDHgxpYPQMSFECUq3occ11GLnK81IRLc4PcEceaKNzxG6BcS8ZRaSdQkbA0rS6lGIBXM2xPdH58lGyfEVsU8kS4DT-FszmcPcP9DUrvx50IInSYfiWg_dg5dBsE3QC9171eSzbmS6DmACXWaQrk&sai=AMfl-YQHNXKe76lXnrJpUv5JwLKA-aOk-GKwZI92Az31vslU7xxWUXkJnWcf28VBPBQJHmJYLls5SeMZ6xCdR00CzlWQ-w9fkIAxBjcdjW91D-luWZbtSOQaBuT7fV7K&sig=Cg0ArKJSzAF1Z8BTkeVdEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:13 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/ Frame D085
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20181107/r20180604/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:821::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/r20181107/r20180604/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
cookie
test_cookie=CheckForPermission
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, 27 Nov 2018 13:57:31 GMT
expires
Tue, 11 Dec 2018 13:57:31 GMT
content-type
text/html; charset=UTF-8
etag
12810928231326100212
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6940
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
6642
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile8&zMoatRendered=5&zMoatSlotTargetingLoaded=5&zMoatSlotTargetingSet=5&zMoatPageDataTargetingSet=5&zMoatSafetyTargetingSet=5&zMoatEmptySlot=0&zMoatNadoDataLoadTime=262&zMoatAllDataLoadTime=262&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=262&zMoat_YI3=262&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=473654654&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:13 GMT
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
4 KB
2 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=428703
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2606:4700:30::6818:6624 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
5853022914f5075dc37fb45f3cc35370d3004dc85dd3cfd8d7e63a4584485a32
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
Tue, 27 Nov 2018 15:48:13 GMT
content-encoding
gzip
x-content-type-options
nosniff
cf-cache-status
HIT
status
200
content-length
1769
timing-allow-origin
*
last-modified
Tue, 27 Nov 2018 12:05:33 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
accept-ranges
bytes
cf-ray
4805bce13d8197f8-FRA
access-control-allow-headers
Origin, X-Requested-With, Content-Type, Accept, Range
expires
Tue, 27 Nov 2018 16:48:13 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
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/
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
Tue, 27 Nov 2018 15:48:13 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-e209"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Fri, 28 Dec 2018 15:48:13 GMT
truncated
/
189 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bcbb7f7a45bda0445c0f861217bd4766f126d88e6f005f749df8a6e997a40f96

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/javascript
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/ Frame 4891
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20181107/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_275.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
106c5562d37543e0d9505b8b75c787eaeaa2ee08a99f9f385568f565b0444afb
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 27 Nov 2018 14:32:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
4556
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=":443"; ma=2592000; v="44,43,39,35"
content-length
27325
x-xss-protection
1; mode=block
server
cafe
etag
2726007002868826454
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 11 Dec 2018 14:32:16 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 4891
262 KB
81 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
708e35f846bc89ecb31ef93fbe98fee0c40e80e394732ba020d3cda631d7730b

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
Tue, 27 Nov 2018 15:48:13 GMT
Content-Encoding
gzip
Last-Modified
Wed, 14 Nov 2018 17:30:08 GMT
Server
AmazonS3
x-amz-request-id
273E12844467B903
ETag
"f34e886d014714d6db71cfc621ce64f2"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=57851
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
82736
x-amz-id-2
xvRbPoVs4Nq4eoBChMZ7pwceS9eB1Pi0TP8dlSTu6Ou8PdetOMmexG+loo7iJpJ8H6Npon9oYZM=
truncated
/ Frame 4891
217 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
dee70d789d24720c1c8d0765e42c1394063692be6ccd91c547610558c8ba75ea

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 4891
0
56 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjss4Bt8MYdrPmn2l-dnS3OPRmDQhWcuU90iI6HwO1RUeQF8S95_033Qo4kgS3_SJ9Jw2Nu8HIQj192ikpvSIIcqAdAGJlz01xA1Eo7pw7Ubf_S-eeAAVuFVYCEOyl25Kr2keBM0TO0QunuRPCtSgxvSToCZDeg0BisN43KJH1p3TciRrM6KIsHJic75AIfy1_pb89jmQ-mmXMPeMghMVcdzqdOcx3TDx2Cin_A01w77ZIUUG60sg4v_z0LS1OQ&sai=AMfl-YTIL12Mt-WNsRptLJNFUVG5ApngWgbJ6wXCaPEgNayDCgHvJlYfXo2z-WzW3JaC078SEZXT2ERFGr6v0iMPocE_SrFLHtW3pTA09DunBb89YeMT_ljES6z88C2n&sig=Cg0ArKJSzLlmmdHEOSsOEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.23.162 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s22-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

timing-allow-origin
*
date
Tue, 27 Nov 2018 15:48:13 GMT
x-content-type-options
nosniff
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
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
ima3.js
imasdk.googleapis.com/js/sdkloader/
231 KB
80 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
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81f::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5dee61d09dc42a128fc6c38a3c7b116fa8876ca8497ef8d354e4845fbc4d2804
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
Tue, 27 Nov 2018 15:48:13 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,35"
content-length
81378
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:13 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

Access-Control-Allow-Origin
*
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

Access-Control-Allow-Origin
*
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

Access-Control-Allow-Origin
*
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: z.moatads.com
URL: https://z.moatads.com/iqdigital277772407506/moatad.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
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
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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Fri, 28 Dec 2018 15:48:13 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: z.moatads.com
URL: https://z.moatads.com/iqdigital277772407506/moatad.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
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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
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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-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
Fri, 28 Dec 2018 15:48:13 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1543333691980&de=266004383227&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=3595e181146-clean&zMoatDfpSlotId=iqadtile4&zMoatRendered=6&zMoatSlotTargetingLoaded=6&zMoatSlotTargetingSet=6&zMoatPageDataTargetingSet=6&zMoatSafetyTargetingSet=6&zMoatEmptySlot=0&zMoatNadoDataLoadTime=262&zMoatAllDataLoadTime=262&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=262&zMoat_YI3=262&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1102388955&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
23.211.10.211 Cambridge, United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-211-10-211.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

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
Tue, 27 Nov 2018 15:48:13 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Tue, 27 Nov 2018 15:48:13 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame E5BC
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=1807761192&adf=4218561337&w=800&guci=1.2.0.0.2.2.0.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1543333693275&bpp=17&bdt=844&fdt=787&idt=786&shv=r20181107&cbv=r20180604&saldr=aa&correlator=6405723172870&frm=23&ife=4&pv=1&ga_vid=1741087841.1543333694&ga_sid=1543333694&ga_hid=856712356&ga_fc=0&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=11326&biw=1585&bih=1200&isw=800&ish=250&ifk=539073182&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=2&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=15&osw_key=2012678058&ifi=1&uci=1.ggn3zd2gw9bm&fsb=1&dtd=796
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:821::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-6583763995580712&output=html&h=250&slotname=9888525209&adk=1807761192&adf=4218561337&w=800&guci=1.2.0.0.2.2.0.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&adsid=NT&dt=1543333693275&bpp=17&bdt=844&fdt=787&idt=786&shv=r20181107&cbv=r20180604&saldr=aa&correlator=6405723172870&frm=23&ife=4&pv=1&ga_vid=1741087841.1543333694&ga_sid=1543333694&ga_hid=856712356&ga_fc=0&iag=3&icsg=2728&nhd=1&dssz=14&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=393&ady=11326&biw=1585&bih=1200&isw=800&ish=250&ifk=539073182&scr_x=0&scr_y=0&eid=21060853&oid=3&rx=0&eae=2&fc=656&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=15&osw_key=2012678058&ifi=1&uci=1.ggn3zd2gw9bm&fsb=1&dtd=796
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
cookie
IDE=AHWqTUnEGlgbfv0XxZhviXKuwMs3nS3n1qfHz-Le78H3fnIAfvoqowqvT9BijKGQ
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
gzip
date
Tue, 27 Nov 2018 15:48:14 GMT
server
cafe
cache-control
private
content-length
12083
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
osd.js
pagead2.googlesyndication.com/pagead/js/r20181107/r20100101/ Frame 4A9E
74 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20181107/r20100101/osd.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20181107/r20180604/show_ads_impl.js
Protocol
SPDY
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
e9cf77edb95978fa6b193724ee40fde091368427e030fed8735cdef6b1a35535
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 26 Nov 2018 15:43:08 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
86705
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,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27460
x-xss-protection
1; mode=block
server
cafe
etag
5000825381819961729
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Mon, 10 Dec 2018 15:43:08 GMT
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=4659875651
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpdGhhaU5nSWViZWlsb289YWl0aGFpTmdJZWJlaWxvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kucGV8fCh5LnBlPTApO3kucGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5wZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk1hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5KZyhsKSxhLmdlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLnhvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLktjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuRXUobSk7YS5EdShsKTthLnR1KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubGs9dGhpcy5hWzldO3RoaXMuSnY9CnRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLkxsPXRoaXMuYVsxXTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLm1wPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuU3Y9YjtiLnByb3RvdHlwZT17a2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxrOnRoaXMuSXYoYSl9LEl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kdjp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG86dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5idihhKX0sYnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmN2OnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5tcDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgaWE9Yy5Tdnx8aWEsSWM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SWMua2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueG89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5yZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmZ1LmJpbmQodGhpcykpfWMubmo9YjtiLnByb3RvdHlwZT17cmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sem46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0sCnBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LHphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxmdTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5ldShhLmRhdGEpfSxldTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsCmNiOmJ9KX0sdGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55cShhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuamcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx5cTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYKKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0seG46ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLm5xKGEpKXJldHVybjsoYj10aGlzLnRmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxucTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxFZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LExmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxZdTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKYWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxiZzpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXQpcmV0dXJuITE7Yz10LmhlaWdodCp0LndpZHRoO2Q9dC53aWR0aDtmPXQuaGVpZ2h0OwowPnQudG9wJiYoZis9dC50b3ApO3QuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dC5sZWZ0JiYoZCs9dC5sZWZ0KTt0LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXQucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrCi4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxWZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHQ9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsCm09MzI4NTM3NzUyMCxuLGssdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPApwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXQ7az1BO3c9bDtxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmCjQyOTQ5NjcyOTU7dD10K24mNDI5NDk2NzI5NTtBPUErayY0Mjk0OTY3Mjk1O2w9bCt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHQpK2IoQSkrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHQsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix0PWMmNjMsaXNOYU4oZik/ZT10PTY0OmlzTmFOKGMpJiYodD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh0KTtyZXR1cm4gYn0sVHI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx3ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHQ9ITEsQT0hMSxrPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuc28/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxBPSF0JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KGt8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXQ7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWs7YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy53ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJgooYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtHaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxaaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxlcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxCbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sb286ZnVuY3Rpb24oKXtyZXR1cm4gYS5HaCgpfHxhLlpoKCl8fGEuZXIoKXx8YS5hbCgpfHxhLkJtKCl9fTtyZXR1cm4gYS5vbygpfSwKSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp7fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRZjpmdW5jdGlvbihhKXthPXRoaXMuSmEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxqYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHdwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LFd1OmZ1bmN0aW9uKGEsCmIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LElmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy4kZyhiKSsiOiIrdGhpcy4kZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LENlOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYiwKe2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxaYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5SYyhiLGQpKTtiJiYoaD1rLlJjKGEsYikpO2YmJihoPWsuUmMoaCxmKSk7YyYmKGg9ay5SYyhoLGMpKTtlLlpiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLm5jfHwodGhpcy5uYz17fSk7dGhpcy5uY1tmXXx8Cih0aGlzLm5jW2ZdPTApO3RoaXMubmNbZl0rKzsxMDx0aGlzLm5jW2ZdfHwoZj1tLnplKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxtLkdhKGYsITApLGY9bS5HYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixtLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxoZTpmdW5jdGlvbigpe20mJm0uYWE/bS5pc0VuYWJsZWQmJm0uTG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSw1MDApfSxTZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLldjKGEpOiIifSxXYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlVkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sCnlvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuYWUoYSl8fHRoaXMuVnIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LkhnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuRWYoYSkpcmV0dXJuIHRoaXMuRWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk1hKGEsYi51YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5aYygpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy54bihjLGEpO3JldHVybiBjfSxNYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHQpe3ZhciBrPWh8fG07aD0hMDt0JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suR2EoYSxoKTtoPWsuR2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT0KZFtxXTtyZXR1cm4gay5JYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoYSxiLGQsZixjLGssZSx0KX0uYmluZCh0aGlzKSw1MDApfSxqZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdD0hMDtlJiYodD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHQpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sc3M6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMubWMpZm9yKHZhciBjIGluIHRoaXMubWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5tY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuemIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxrZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKYy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnNzKGYuWmMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1jPWF9LFZ3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5NYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIiwKZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxwbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLAphPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFJyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLm5qfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5zeD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1qPWI7Yi5SYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuU3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHc9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07CmIuYXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnBuPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLmhuPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5sbj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ybj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuZ249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Iuam49e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlRzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmJxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Bdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5abz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLmhwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5MYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5LYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Iubm49e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLm1uPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5nZj17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuZmY9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Iuc249e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmtuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5Zdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Wcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMubWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzddO3RoaXMud3I9dGhpcy5hWzNdO3RoaXMudGg9dGhpcy5hWzRdO3RoaXMuUHM9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbMTBdfWMueGk9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLndyOnRoaXMuc2goYSl9LHNoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy50aDp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBqYT1jLnhpfHxqYSxKYz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1KYy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLm9qPWI7Yi5wcm90b3R5cGU9e1ZkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4Iil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFNjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5TYyhhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5TYyhNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGZjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVmQodGhpcy5mYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLlNjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxKcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZjKCkrIjIifSxaZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlZkKHRoaXMuQnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5TYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMub2p8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzEwXTt0aGlzLktrPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNl07dGhpcy5WcD10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs1XX1jLk1yPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eczp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2s6dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcDp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkJzOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIGthPWMuTXJ8fGthLEtjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLkNzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5UZT1ifSkoYyk7dmFyIEs9Yy5UZXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mbj10aGlzLmFbNV07dGhpcy5Waj10aGlzLmFbNl07dGhpcy5NbT10aGlzLmFbNV07dGhpcy5rbz10aGlzLmFbMl07dGhpcy5ZdD10aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbOF07dGhpcy5laj10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs2XX1jLnp3PWI7Yi5wcm90b3R5cGU9e2VuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5mbjp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlZqOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NbTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLll0OnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWo6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYT1jLnp3fHxsYSxMYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5lbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLm5sPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueWE9e307dGhpcy5BPW51bGw7dGhpcy5qYz0KMTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy5GdShiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKTowPnRoaXMueGEmJih0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYj50aGlzLnhhPyEwOiExfSxGZzpmdW5jdGlvbigpe3RoaXMub2I9MH0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZ1OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxBcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmZiKCldPWI7TCYmTC5oZyYmTC5adShiKX0sQXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5GYSh0aGlzLnlhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy55YSlpZihhPT0KdGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxTcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LE94OmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMubmx8fHI7KGZ1bmN0aW9uKGMpe2MucGw9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5qYz0xMDt0aGlzLm9iPTA7dGhpcy54YT01MDt0aGlzLks9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWI7dGhpcy5oYj0iIjt0aGlzLnlmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz0KYSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxPdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxJdTpmdW5jdGlvbihiKXt0aGlzLmxlPWJ9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV9LGtlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5vYjw9dGhpcy54YSYmKHRoaXMub2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmpjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxLZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxQeDpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5YcSgpfHx0aGlzLnVuKCk7dGhpcy5EZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHVuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLnBhKDEwKSl9LFhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LCRjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmthPSEwfSxHYjpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS2c6ZnVuY3Rpb24oYil7dGhpcy5oYj1ifSx5eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhifSxFZzpmdW5jdGlvbigpe3RoaXMuaGI9bnVsbH0sRXg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmhiJiYoYj0hMCk7cmV0dXJuIGJ9LEt4OmZ1bmN0aW9uKCl7dGhpcy55Znx8KHRoaXMueWY9ITApfSxUYzpmdW5jdGlvbigpe3JldHVybiExfSwKdng6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMucGx8fHA7KGZ1bmN0aW9uKGMpe2MucGg9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLkE9dGhpcy5wbGF5ZXI9IiI7dGhpcy5iZj0iMSI7dGhpcy5jZj0iMiI7dGhpcy4kbT0iMyI7dGhpcy5zYz0wO3RoaXMubmc9MzA7dGhpcy54Yj1bXTt0aGlzLlJhPVtdO3RoaXMuT2I9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuamY9dGhpcy5kaD0hMTt0aGlzLnN0YXR1cz10aGlzLnNjO3RoaXMuaWQ9ZS5wYSgxMCk7dGhpcy5qZChiKTt0aGlzLkd1KGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuZGh8fCh0aGlzLmRoPSEwLGUuaGUoKSl9LG9lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaWEoKT8hMToodGhpcy5MdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuV2coKSx0aGlzLmpmPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxsOmZ1bmN0aW9uKGIsYSl7dGhpcy5pYSgpfHwodGhpcy54Yi5wdXNoKGIpLHRoaXMuUmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy54YiYmMDx0aGlzLnhiLmxlbmd0aCYmKHRoaXMueGI9ZS51bmlxdWUodGhpcy54YiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMueGIuam9pbigiLCIpKSk7aWYodGhpcy5SYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlJhLmxlbmd0aDtnKyspdGhpcy5PYlt0aGlzLlJhW2ddLnJlYXNvbl09PQp0aGlzLk9iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuT2JbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuT2JbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksYj10aGlzLlJhW2ddLnJlYXNvbik7dGhpcy5PYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LER4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamZ9LG86ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJmfSxMdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuY2Z9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kbX0scGI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnNjfSxkZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5iZn0sang6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuY2Z9LAppYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5zY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sQXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSx2czpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMucGh8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Y9dGhpcy5hWzZdO3RoaXMuSnQ9dGhpcy5hWzldO3RoaXMuTWs9dGhpcy5hWzNdO3RoaXMubGw9dGhpcy5hWzJdO3RoaXMuemo9dGhpcy5hWzEwXTt0aGlzLml0PXRoaXMuYVs1XTt0aGlzLlZsPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs0XTt0aGlzLlRsPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzEwXX1jLnd0PWI7Yi5wcm90b3R5cGU9e1Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuV3Y6dGhpcy5JdChhKX0sSXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkp0OnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Nazp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpqOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pdDp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVmw6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9wOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5UbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIG5hPWMud3R8fG5hLE1jPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Wdig0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpOwp2YXIgVD1jLnBpfHxUOyhmdW5jdGlvbihjKXtjLm9pPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy52ZD1udWxsO3RoaXMuZHc9MUUzO3RoaXMueGc9bnVsbDt0aGlzLnh2PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5zbyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLmdxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5UcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLlNxKGEsYil9LmJpbmQodGhpcykpO2IudnBFdmVudCYmKGIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5ndyhiKX0uYmluZCh0aGlzKSksYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuaHcoYil9LmJpbmQodGhpcykpKTsKYi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuUnEoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLmZwKGEpfS5iaW5kKHRoaXMpKX0sZnA6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxndzpmdW5jdGlvbihiKXt0aGlzLnZkfHwodGhpcy52ZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaXcoYil9LmJpbmQodGhpcyksdGhpcy5kdykpfSxpdzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCk7dGhpcy53KCl9LGh3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZkKX0sUnE6ZnVuY3Rpb24oYil7dGhpcy5xeChiKTt0aGlzLnhnPW5ldyBEYXRlO3RoaXMueGctdGhpcy5idTx0aGlzLnh2P3RoaXMudygpOnRoaXMubygpfSxUcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmpkKG5ldyBUKGEpKSk7CnRoaXMudygpfSxncTpmdW5jdGlvbigpe30sU3E6ZnVuY3Rpb24oKXt0aGlzLmJ1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIG9hPWMub2l8fG9hOyhmdW5jdGlvbihjKXtjLnJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuRmEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyBvYShnLHRoaXMuQSkpLmIoKSl9fXRoaXMuSSgpfX19KX0pKGMpO3ZhciBwYT1jLnJpfHxwYSxxYT1uZXcgcGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnA9dGhpcy5hWzhdO3RoaXMuaT0KdGhpcy5hWzFdfWMuZmw9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnZwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcmE9Yy5mbHx8cmEsTmM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudXAoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt0aGlzLkRmKCk7dGhpcy5GZigpO3RoaXMuZ3A9ITF9LERmOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuRWI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlOwp0aGlzLlMoYil9LEZmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3ZhciBiPXRoaXMuRWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkViPSEwKTt0aGlzLlUoYSl9fSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmCigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKSl9LGtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMubWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpKX0sbWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmCmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5sZSYmKDAsdGhpcy5sZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LAp2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxUYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuT2p8fHNhOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5zYzt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJgooYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMub2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm5nJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5ncD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEucWUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMub2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmcmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy53Yy5pbmRleE9mKGEpJiYKdGhpcy53Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMud2MubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LHZzOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuUGQ/dGhpcy5QZCsrOnRoaXMuUGQ9MTp0aGlzLk9kP3RoaXMuT2QrKzp0aGlzLk9kPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLll1KGEudmlkZW9UYWcpP2EuRWI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy51Y3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLk9kPnRoaXMuUGQmJihiPSExKSx0aGlzLncoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5EZigpLGEuRmYoKSxhLkVifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHRhPWMuTmp8fHRhOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuSmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5TcihnKXx8KHRoaXMuSihnKSxnPW5ldyB0YShnLHRoaXMuQSksCmcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0seHg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sd3E6ZnVuY3Rpb24oKXt2YXIgYj1lLkphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLlBqfHx1YSx2YT1uZXcgdWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3A9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuVmk9YjtiLnByb3RvdHlwZT17RnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgd2E9Yy5WaXx8d2EsT2M9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLkZwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLkRtfHx4YTsoZnVuY3Rpb24oYyl7Yy5DbT11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB5YT1jLkNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5FbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJgp3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgemE9Yy5FbXx8emEsQWE9bmV3IHphKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh2PXRoaXMuYVs1XTt0aGlzLktwPXRoaXMuYVs3XTt0aGlzLkN3PXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVsyXTt0aGlzLlpzPXRoaXMuYVs5XTsKdGhpcy5QcD10aGlzLmFbNl07dGhpcy5jdD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbMTBdO3RoaXMuUHY9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbM119Yy5HaT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHY6dGhpcy5KcChhKX0sSnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLktwOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddzp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5ZcyhhKX0sWXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpzOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QcDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3Q6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnppOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuUHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLkdpfHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5Hdig0KTsoZnVuY3Rpb24oYyl7Yy52bT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlUoYik6dGhpcy5lYSgpKTp0aGlzLmVhKCl9ZWxzZSB0aGlzLmVhKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgQ2E9Yy52bXx8Q2E7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT10aGlzLmVjPXRoaXMuWGE9dGhpcy5CYz0hMTt0aGlzLkNnPWUubmIoMTApO3RoaXMuYmg9ITA7dGhpcy5HZD10aGlzLldmPSExO3RoaXMuc2coKTt0aGlzLklvKCk7dGhpcy5LYSgpfSxMeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLHR5cGVvZiBiLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuVz9iLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkYsIjsiLHR5cGVvZiBiLkYsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5zYT9iLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLnNhP3R5cGVvZiBiLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi56ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5BZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuRmQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5GZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNnKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxVYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj10aGlzLmdiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5tYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5tYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5tYX0sTmY6ZnVuY3Rpb24oKXtpZighdGhpcy5lYyl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5lYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmVjfSwKUXI6ZnVuY3Rpb24oKXtpZighdGhpcy5WZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5PcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVmY9ITApfXJldHVybiB0aGlzLlZmfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuQmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkJjPSEwKTtyZXR1cm4gdGhpcy5CY30sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuQWUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLkdkPSEwO3ZhciBiPXRoaXMuTmYoKTtpZihifHx0aGlzLmlhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuU2I9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLlNiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5TYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuWSgpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHd4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5zZiYmYi5hZHMmJih0aGlzLnNmPWIuYWRzKTtyZXR1cm4gdGhpcy5zZn0sSW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMub2UoKX0uYmluZCh0aGlzKSl9LHZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5OZigpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmYoKX0uYmluZCh0aGlzKSw1MCl9LHNnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPApiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5RcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlVjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlVjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLmdiKCl9ZWxzZSB0aGlzLldmP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nYigpLGI9dGhpcy5VYygpO2EmJiFiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWSgpKToodGhpcy5ZKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxKbzpmdW5jdGlvbigpe3RoaXMuV2J8fCh0aGlzLldiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5XYiE9Yi5hZHMuc3RhdGUmJih0aGlzLldiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLldiKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuV2I9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpvKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITA7dGhpcy5vKCJlbXB0eSB2YXN0Iil9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLmJoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLmJoLGZ1bmN0aW9uKCl7dGhpcy52ZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxPbzpmdW5jdGlvbigpe3RoaXMuR3h8fCgxMDx0aGlzLmV3Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApKToodGhpcy5ldysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9vKCl9LmJpbmQodGhpcyksNTApKSl9LHV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5mdyl7dGhpcy5mdz0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy51bXx8RGE7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUGcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLlBnKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LFBnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTt2YXIgRWE9Yy53bXx8RWEsRmE9bmV3IEVhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl3PXRoaXMuYVs5XTt0aGlzLkN2PXRoaXMuYVs5XTt0aGlzLlhzPXRoaXMuYVs2XTt0aGlzLkh0PXRoaXMuYVs0XTt0aGlzLiR0PXRoaXMuYVs2XTt0aGlzLnhoPXRoaXMuYVs3XTt0aGlzLlh3PXRoaXMuYVs3XTt0aGlzLnNtPXRoaXMuYVszXTt0aGlzLlFtPQp0aGlzLmFbN107dGhpcy5xbT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs0XX1jLmpwPWI7Yi5wcm90b3R5cGU9e0h3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jdzp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3Y6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhzOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdDp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuJHQ6dGhpcy53aChhKX0sd2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhoOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ydzp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnFtOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgR2E9Yy5qcHx8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSHcoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksCmc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApOwpyZXR1cm4gYn0sVGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuUWx8fEhhOyhmdW5jdGlvbihjKXtjLlBsPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm9jPSExO3RoaXMuRGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5vYz0KITAsdGhpcy5vKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy5HYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLnBmKCk6dGhpcy5vKCl9LEdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm9jPSEwLHRoaXMubygpOwp0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMub2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5HYy5iaW5kKHRoaXMpLDEwMCl9fSxwZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSwKdGhpcy5vKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGYuYmluZCh0aGlzKSw1MCl9fSxEZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7CmIuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5vYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5QbHx8SWE7KGZ1bmN0aW9uKGMpe2MuUmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiYKdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuUmx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbMTBdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuRXA9dGhpcy5hWzldO3RoaXMuT2s9dGhpcy5hWzhdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuTHc9dGhpcy5hWzEwXTt0aGlzLm5oPXRoaXMuYVsyXTt0aGlzLnFwPXRoaXMuYVs2XTt0aGlzLlZuPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLkRsPWI7Yi5wcm90b3R5cGU9e1p3OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuJHc6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxzOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FcDp0aGlzLk5rKGEpfSxOazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2s6dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJpOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbjp0aGlzLkt3KGEpfSxLdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHc6dGhpcy5taChhKX0sbWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5oOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcDp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZuOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5EbHx8TGEsUmM9bmV3IExhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLlp3KDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMucmc9YX0sTjpmdW5jdGlvbigpe30saWU6ZnVuY3Rpb24oYil7dGhpcy5yZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5yZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5RaHx8TWE7KGZ1bmN0aW9uKGMpe2MuUGg9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0saWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLlBofHxOYTsoZnVuY3Rpb24oYyl7Yy5SaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuaWUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuaWUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5SaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuVms9dGhpcy5hWzEwXTt0aGlzLkhvPXRoaXMuYVs5XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLmppPXRoaXMuYVs4XTt0aGlzLkZ2PXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5zdD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs5XX1jLnl1PWI7Yi5wcm90b3R5cGU9e3dqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlVrKGEpfSxVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ibzp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSWo6dGhpcy5paShhKX0saWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmppOnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdjoKdGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFrOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54czp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3Q6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBRYT1jLnl1fHxRYSxTYz1uZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53aig0KTsoZnVuY3Rpb24oYyl7Yy50az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksCmE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLnRrfHxSYTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnZjKCl9LmJpbmQodGhpcykpLAokKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSkpOnRoaXMudmMoKX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuc2t8fFNhOyhmdW5jdGlvbihjKXtjLnVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj0KbmV3IFJhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgU2EoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRhPWMudWt8fFRhLFVhPW5ldyBUYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdz10aGlzLmFbNV07dGhpcy4kcT10aGlzLmFbMl07dGhpcy5VbT10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzRdO3RoaXMuRm89dGhpcy5hWzRdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOF19Yy5BbT1iO2IucHJvdG90eXBlPXtRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRxOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLkJqOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLkFtfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Rdyg0KTsoZnVuY3Rpb24oYyl7Yy5jbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLnJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYKKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxjdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5xZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMucmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLAoiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnJlKys7aWYoMTA8dGhpcy5yZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpOwp2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLmNsfHxXYTsoZnVuY3Rpb24oYyl7Yy5ibD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlJkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUmQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsCmEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLlhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJgohdGhpcy5lcT8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5lcT0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuY3UoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuYmx8fFhhOyhmdW5jdGlvbihjKXtjLmRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5kbHx8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVzPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVsxMF07dGhpcy5Hdz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs3XX1jLlpyPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLkhtKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd3OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyICRhPWMuWnJ8fCRhLFVjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLmRzKDQpOyhmdW5jdGlvbihjKXtjLmpqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5VKGIuZWxlbWVudCl9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sCnZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciBhYj1jLmpqfHxhYjsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgYmI9Yy5panx8YmI7KGZ1bmN0aW9uKGMpe2Mua2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLApmdW5jdGlvbihiKXtiPW5ldyBhYihiLmRldGFpbCk7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYmIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBjYj1jLmtqfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanU9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzFdO3RoaXMuVGo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzEwXTt0aGlzLmt0PXRoaXMuYVsyXTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qdTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5TaihhKX0sU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRqOgp0aGlzLktyKGEpfSxLcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHI6dGhpcy5qdChhKX0sanQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmt0OnRoaXMuc3AoYSl9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmw6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBlYj1jLkRyfHxlYixWYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy5pdSg0KTsoZnVuY3Rpb24oYyl7Yy5Eaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5MZihiLCJlbGVtZW50SUQiKTt0aGlzLnpnPWIucG9zaXRpb25pbmc7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuUGM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5QYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApObzpmdW5jdGlvbigpe2UuYWcodGhpcy5QYyk7ZS5iZyh0aGlzLlBjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTm8oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBmYj1jLkRqfHxmYjsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZ2I9Yy5Danx8Z2I7KGZ1bmN0aW9uKGMpe2MuRWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy54YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuTGYoYiwiZWxlbWVudElEIik7ZS5hZyhhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMudGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGhiPWMuRWp8fGhiLGliPW5ldyBoYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLll3PWI7Yi5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Lbjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuWXd8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLkpuKDQpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMucGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sSHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx2bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLnBqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuUGE9YTt0aGlzLkhmPXRoaXMubGg9ITE7dGhpcy50Zz1kO3RoaXMuUWc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuUGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8CjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLmJlKHRoaXMuUGEudXJsKSYmbS5yZCl7dmFyIGg9bmV3IHooYS51cmwpO2guSHUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLnFqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBhLmRhdGE7CmlmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5IZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUWc/dGhpcy52Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCExKTp0aGlzLnZiLm9wZW4odGhpcy5QYS5tZXRob2QsdGhpcy5QYS51cmwsITApLHRoaXMubGh8fCh0aGlzLnZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx0aGlzLnZiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5iZSh0aGlzLlBhLnVybCk/bS5yZD9tLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLmJlKHRoaXMuUGEudXJsKSwKdGhpcy50ZyYmdGhpcy50ZygpfXJldHVybiB0aGlzLnZifX19KShjKTt2YXIga2I9Yy5xanx8a2I7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuVWI9IiI7dGhpcy5IZD10aGlzLlRiPXRoaXMuZWI9bnVsbDt0aGlzLnhwPXRoaXMucWI9dGhpcy5pZz0hMTt0aGlzLnVhPSIiO3RoaXMuZGc9ITE7dGhpcy5CYT10aGlzLlhjPSIiO3RoaXMuJGY9dGhpcy5hYT10aGlzLmlzRW5hYmxlZD10aGlzLnhlPSExO3RoaXMuT2E9W107dGhpcy5UZj10aGlzLkliPSIiO3RoaXMuTmQ9ITE7dGhpcy5LZT0wO3RoaXMuWGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5WZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMucmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjsKdGhpcy5LYj0iIjt0aGlzLnJiPVtdO3RoaXMuTGI9W107dGhpcy5KYj0iIjt0aGlzLkxlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuWGQ9ITE7dGhpcy5Qbz10aGlzLnNkPW51bGw7dGhpcy5OZz10aGlzLnBjPXRoaXMuQWY9dGhpcy5OZT10aGlzLnJkPXRoaXMuSWQ9dGhpcy50Yz0hMTt0aGlzLlNhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLnJqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuVWIsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5UYixhZHRhZ3JlZ2V4OnRoaXMuSGQsanNwb3B1cHM6dGhpcy5pZyxzaWRlbG9hZHM6dGhpcy5xYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMudWEsaXNJbml0aWFsaXplZDp0aGlzLmRnLGdsb2JhbENvbmZpZzp0aGlzLlhjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCwKaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLiRmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkliLGhvbWFkQWRwYXRoOnRoaXMuVGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5OZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5LZSxIT01BRF9WRVJJRklFRDp0aGlzLlhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5WZSxIT01BRF9OT0JMT0NLRVI6dGhpcy53YixIT01BRF9BREJMT0NLRVI6dGhpcy5yYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuV2UsdGVzdEhpZGU6dGhpcy5LYix0ZXN0VGFnczp0aGlzLnJiLHRlc3RUYWdzSlM6dGhpcy5MYix0ZXN0Q29va2llOnRoaXMuSmIsdGhyb3R0bGU6dGhpcy5MZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLlhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuUG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy50YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuSWQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucmQsCnVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLk5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkhiLHNlcnZlcklkOnRoaXMuSWcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlliLHZwYWlkOnRoaXMucGMsc2tpcEFsbG93ZWQ6dGhpcy5OZ319LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJihhPSEwKTtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dGhpcy5TYVthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxwZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5wbyhhKX0sR2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixsPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLmFlKGEpO2U9dGhpcy5KYShhKTtjPyh0aGlzLmdjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsbD1lLnBhdGguc3Vic3RyKDEpKTooaD10aGlzLnplKCksbD1lLnBhdGguc3Vic3RyKDEpKyhlLnF1ZXJ5PyI/IitlLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuVWJ8fHRoaXMuZWJ8fAp0aGlzLlRifHx0aGlzLkhkKSYmKGw9dGhpcy5OcyhsKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnpxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1sO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGwpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmdjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTsKcmV0dXJuIGJ9LGdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxiZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLmFlKGEpO3JldHVybiBifSx6cTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudWEmJjA8dGhpcy51YS5sZW5ndGgpcmV0dXJuIHRoaXMudWE7Zm9yKGQgaW4gdGhpcy51YSlpZihiPXRoaXMudWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09CmEpcmV0dXJuIGIub3g7cmV0dXJuIm5vbmUifSxaYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMuSWddfSx6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWmMoKSxiPXRoaXMuTWcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb2c6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLkphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEQ9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksCmM9e30sbD0wO2w8RC5sZW5ndGg7bCsrKXt2YXIgdD1EW2xdLnNwbGl0KCI9Iik7Y1t0WzBdXT10WzFdfWZvcih2YXIgayBpbiBiW2hdLnN1YnZhbHVlcyljW2tdPXRoaXMub2coY1trXSxrLGJbaF0uc3VidmFsdWVzW2tdKTtEPVtdO2ZvcihrIGluIGMpRC5wdXNoKGsrIj0iK2Nba10pO2M9RD1lbmNvZGVVUklDb21wb25lbnQoRC5qb2luKCImIikpfWVsc2UgYz10aGlzLm9nKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9az1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWsucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sTnM6ZnVuY3Rpb24oYSl7dGhpcy5VYiYmKGErPXRoaXMuVWIpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3RoaXMuVGImJihhPXRoaXMuTXMoYSx0aGlzLlRiKSk7cmV0dXJuIGF9LApjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5kZz0hMDt0aGlzLlhjPWE7dGhpcy5CYT1iO3RoaXMueGU9ZDt0aGlzLnNkPWM7dGhpcy5OYz1lO3RoaXMuSGI9aHx8e307dGhpcy5ycygpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5CYSl0aGlzLnBzKCk7ZWxzZSB0cnl7dGhpcy5CYT1iKCksdGhpcy5JYygpfWNhdGNoKGwpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scnM6ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyB6KHRoaXMuWGMrdGhpcy56YygiZ2xvYmFsIikpLHRoaXMuTXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5JYygpfS5iaW5kKHRoaXMpLAohMCl9LHBzOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnpjKCJjbGllbnQiKSk7dGhpcy5JYShuZXcgeih0aGlzLkJhK3RoaXMuemMoImNsaWVudCIpKSx0aGlzLkljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx6YzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5uYigpO3RoaXMuSGImJnRoaXMuSGIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkhiJiZ0aGlzLkhiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSWQpe3RoaXMuSWQ9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07CnRoaXMuTmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OYz90aGlzLk5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmFhPXRoaXMuJGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVmUpKTt0aGlzLnViKCk7ZS5aYihrLlN0KTsoYj1lLlFmKHRoaXMuWmMoKSkpfHwoYj1lLlFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxNcTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5JYnx8dGhpcy51YXx8dGhpcy5JYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX19LEljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuT2E9YS5zZXJ2ZXJ8fFtdO3RoaXMuSWI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLlRmPWEuYWRwYXRofHwiIjt0aGlzLk5kPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuSWc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuT2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYiYmdGhpcy51YSYmdGhpcy5PYS5sZW5ndGg/dGhpcy5iZCghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSx0aGlzLnViKCkpfSxiZDpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy56ZSgpKSxjPXRoaXMuSmEodGhpcy5JYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkliK3RoaXMuemMoImN1c3RvbWVyIikpO3RoaXMuSWEoYix0aGlzLmF2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjdXN0b21lciIpO2E/dGhpcy5FbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLkVsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZCghMCl9LmJpbmQodGhpcyksCjEwMCkpOnRoaXMuYmQoITApfS5iaW5kKHRoaXMpLCEwKX19LGF2OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fXRoaXMucmQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy5OZT10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFmPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5ZYj10aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuS2I9Yi50ZXN0aGlkZXx8IiI7dGhpcy5yYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5VYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlRiPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5IZD1iLmFkdGFncmVnZXh8fApudWxsO3RoaXMuaWc9Yi5qc3BvcHVwc3x8ITE7dGhpcy5xYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5wYz1iLnZwYWlkfHwhMTt0aGlzLkhiLnZwYWlkPXRoaXMucGM7dGhpcy5OZz1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkVjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5KYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5OZCYmKHRoaXMuSmI9bnVsbCk7dGhpcy5MZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLlhkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5YZD0hMCx0aGlzLmJkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnN2KCkmJih0aGlzLktifHx0aGlzLkxifHx0aGlzLnJifHx0aGlzLkpiKT90aGlzLnhlPyh0aGlzLm9hPXRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSwKdGhpcy5KZCgpLHRoaXMudWIoKSk6dGhpcy5odigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLml2KCkpfX0saHY6ZnVuY3Rpb24oKXt0aGlzLmd2KCl9LGl2OmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKX0scWQ6ZnVuY3Rpb24oYSl7dGhpcy50Yz0hMDt0aGlzLmFhfHwodGhpcy5hYT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYShhKSksdGhpcy51YigpLHRoaXMuSmQoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5LYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLktiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5xZCh0aGlzLnJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VZygpfWVsc2UgdGhpcy5VZygpfSxUZzpmdW5jdGlvbigpe3ZhciBmO3ZhciBjO2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5uYigpKTt0aGlzLmx2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5IZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5yYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMucmI9bnVsbCx0aGlzLkhlKCl9LGx2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7ZSgpJiYKYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0sVWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoKSk7dGhpcy5tdihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLnFkKHRoaXMucmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuTGImJnRoaXMuTGIubGVuZ3RoKXt2YXIgYz10aGlzLkxiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVGcoKX0sbXY6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtoKCkmJmIoKX1mdW5jdGlvbiBlKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gbD8od2luZG93LmNsZWFyVGltZW91dChsKSwhMCk6ITF9dmFyIGw9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChtKXtmKCl9fSxIZTpmdW5jdGlvbigpe3RoaXMuSmI/KHRoaXMuS2UrKyx0aGlzLklhKG5ldyB6KHRoaXMuSmIpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuSWUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5SZygpfSxJZTpmdW5jdGlvbihhKXt0aGlzLnFkKHRoaXMuV2UsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuS2U/dGhpcy5IZSgpOnRoaXMuSWUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlJnKCk6dGhpcy5JZSgiQUFBIil9LFJnOmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKTt0aGlzLkpkKCl9LHViOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMudGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlhlKSk7CnRoaXMuc2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5zZCYmdGhpcy5zZCgpfSxNbzpmdW5jdGlvbigpe2lmKHRoaXMuTmUmJnRoaXMuVnEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sV2c6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsYyxmLGgsRCl7YT1uZXcga2IoYSxiLGMpO2YmJihhLmxoPSEwKTtoJiZlLlRyKCkmJihhLkhmPSEwKTtEJiYoYS5RZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxuZjpmdW5jdGlvbigpe2UuWWEoKXx8ZS5NYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmdjKCl8fChhPXRoaXMuSmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKaC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5oYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sTG86ZnVuY3Rpb24oKXt0aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5JYShhLHRoaXMuJHYuYmluZCh0aGlzKSx0aGlzLlp2LmJpbmQodGhpcykpfSwkdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuY3EoKX0sWnY6ZnVuY3Rpb24oKXt9LGNxOmZ1bmN0aW9uKCl7ZS5aYihrLmJxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxKZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnFiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMucWIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMucWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuTWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLmZjKCldPXRoaXM7ZS5NYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxzdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLkxlfSxIcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxsLGssbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsbD0oZiYxNSk8PDJ8ZT4+NixrPWUmNjMsaXNOYU4oZik/bD1rPTY0OmlzTmFOKGUpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHUseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTQwOzU5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfG4md3xwJncpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBsYj1jLnJqfHxsYixtPW5ldyBsYjt3aW5kb3cudHg9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vdT10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbN107CnRoaXMuRW49dGhpcy5hWzZdO3RoaXMuUXE9dGhpcy5hWzJdO3RoaXMueWs9dGhpcy5hWzVdO3RoaXMudWk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbN119Yy5GaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub3U6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fbjp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUXE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlrOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIG1iPWMuRml8fG1iLFhjPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5udSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmY9YTthLnUuTD90aGlzLk5hPWEudS5MKCk6dGhpcy5OYT0iIjt0aGlzLmNvbnRhaW5lcj10aGlzLmYuVGE7dGhpcy5wbGF5ZXI9dGhpcy5mLnU7dGhpcy5BYj10aGlzLkNjPSExO3RoaXMubm89MUUzO3RoaXMuZGE9bnVsbDt0aGlzLlA9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5vZD17fTt0aGlzLkFjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuQWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5mLnUpJiZ0aGlzLmYudS5CJiYoYT10aGlzLmYudS5CKCkpLHRoaXMuQWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7CnRoaXMubmQ9ITE7dGhpcy5sZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5tPXt9O3RoaXMueWM9ITE7dGhpcy5aZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkRiPSExO3RoaXMuaXA9ZS5wYSgxMCk7dGhpcy5kZD1lLnBhKDEwKTt0aGlzLm1lPWUucGEoMTApO3RoaXMuT2c9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWGI9dGhpcy5rYj0hMTt0aGlzLlFkPW51bGw7dGhpcy5aZD10aGlzLnVlPXRoaXMuS2Q9dGhpcy5NYz10aGlzLkdlPXRoaXMudmc9dGhpcy5RYz10aGlzLnl2PXRoaXMuYWI9ITF9Yy5saj1iO2IucHJvdG90eXBlPXtKZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxYZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuSGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuUC50Yz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQoay5tbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpfSxnZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuUC5hYSl0aGlzLlAuTW8oKSx0aGlzLlAub2EmJnRoaXMuUC5pc0VuYWJsZWQ/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5QLnBjfSkpOmI/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUC5wYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQ2EoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZ2UoYSwKYixjKX0sNTApfX0sc2U6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMTt0aGlzLm09YTt0aGlzLlB1KHRoaXMubSk7dGhpcy5SZihhKX0sUmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMub2Q9dGhpcy5KcShhKSksdGhpcy5SZihhLnBhcmVudCkpfSxKcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWil7Yj1hLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5aLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmCihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZ2E6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLk9jJiZhLk9jLmVycm9yJiZhLk9jLmVycm9yLmNvZGUmJihiPWEuT2MuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5xYy5jb2RlOmI9PUUueGQuY29kZT9lLkQoay50dyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpOihlLmhlKCksYj09RS4kZS5jb2RlJiZlLkQoay5Ucyx0aGlzLm0uUix0aGlzLmYudS5CKCksCnRoaXMuVCgpKSk7ZS5EKGsuYXEsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB4LlllLmNvZGU6ZS5EKGsuYXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LmFmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGsuQXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC55ZC5jb2RlOmUuRChrLkp3LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC53ZC5jb2RlOmUuRChrLlVzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLAp0aGlzLlhifHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLmxhJiYoYys9Il8iK2EuZXJyb3IubGEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5CYihhKTt0aGlzLkNhKCl9LEJiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5BYS5sZW5ndGg7KXRyeXt2YXIgYz1hLkFhLnBvcCgpO3RoaXMuZmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LFB1OmZ1bmN0aW9uKGEpe3RoaXMuS2Q9dGhpcy5aZD10aGlzLnVlPSExO3RoaXMucmE9dGhpcy5mLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmYuQzsKYi5NeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuQW4mJnRoaXMucGxheWVyLlRjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5UYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuTS5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5NW2NdLnR5cGUpJiZ0aGlzLnduKGIsYS5NW2NdLnVybCsiIixhLk1bY10udHlwZSk7dGhpcy5WZyhiKT8odGhpcy55bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmRhPQp0aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5tLmNwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5OdSgpKTp0aGlzLiRkKCk/dGhpcy5MZygpOnRoaXMubS5vcmlnaW4uQmYoeC53ZCl9LE51OmZ1bmN0aW9uKCl7ZS5yZigpO3RoaXMubSYmdGhpcy5tLm9yaWdpbiYmdGhpcy5tLm9yaWdpbi5TZSYmZS56bih0aGlzLm0ub3JpZ2luLlNlKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5mLkM7dGhpcy5mLkM9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuZi5DLGEpO3RoaXMuZi53ZygpOwp0aGlzLmYubGMoKTtmb3IoYT10aGlzLmYuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5mLmxjKCk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5mLkcuYXBwZW5kQ2hpbGQodGhpcy5PKTt0aGlzLk8ub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLkxxKCksYj10aGlzLm0uUi5PcmlnaW5hbEFkUGFyYW1ldGVycywKYz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDphLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTphLmRlc2lyZWRCaXRyYXRlfHxhLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpifSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuZi5HLnN0eWxlLmhlaWdodCl9fX07ZS56YSh0aGlzLk8sImNvbmZpZyIsYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnlvKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuUCk7dGhpcy5PLnNyYz1hO2UuRWQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt3KGEpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMubHcoKSx0aGlzLmYuY2MoITApKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmYuY2MoITApLHRoaXMubncoKSksIkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmNjKCEwKSx0aGlzLnJ3KCkpLCJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB3KCksIkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF3KCksIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coKSwiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3coKSwiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaWgoKSl9LmJpbmQodGhpcykpOwplLkVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcykpO2UuRWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmYudG4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxudzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpfSxsdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIil9LHJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlFhKCJzdGFydCIpfSxwdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtlLlFhKCJmaXJzdFF1YXJ0aWxlIil9LHF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpfSxzdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlFhKCJ0aGlyZFF1YXJ0aWxlIil9LApvdzpmdW5jdGlvbigpe3RoaXMudGQoKTtlLlFhKCJjb21wbGV0ZSIpfSxpaDpmdW5jdGlvbihhKXtpZih0aGlzLk8mJnRoaXMuTy5wYXJlbnROb2RlJiZ0aGlzLk8ucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLlFhKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLk8ucGFyZW50Tm9kZTt0aGlzLk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLk8pO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTt0aGlzLk89ZS5iYT0hMTt0aGlzLkNhKGEpfX0sa3c6ZnVuY3Rpb24oYSl7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLm1lc3NhZ2UsITApO2UuUWEoImVyciIsYS5tZXNzYWdlKTt0aGlzLmloKCEwKX0sd246ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5QO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5nYygpPyhmPWUuSmEoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsCiJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuY3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LHluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhoLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuUGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGg6ZnVuY3Rpb24oYSl7dGhpcy5BYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFifHx0aGlzLlBlKGEpfS5iaW5kKHRoaXMpLHRoaXMubm8pKX0sUGU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuQ2MmJnRoaXMuVmcodGhpcy52aWRlbykmJiF0aGlzLmtiJiYhdGhpcy5BYil7dGhpcy5DYz0hMDt0cnl7aWYoIWUuWWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMubS5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMua2J8fCh0aGlzLmtiPSEwLHRoaXMuaGQodGhpcy52aWRlbyksCmUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuUC5BZnx8dGhpcy5QLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuQ2EoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwiIiwhMCl9dGhpcy5idygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5mLmxjKCk7dGhpcy5laCgpO3RoaXMuZmgoKTt0aGlzLmxmKCk7dGhpcy5mLndnKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZlKCl9fSxGZTpmdW5jdGlvbigpe2lmKCF0aGlzLk1jKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuSGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuWWM9W107Zm9yKHZhciBiPXRoaXMuZi5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlljLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PQoibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMueGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsCmIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhjKCl9ZWxzZSB0aGlzLnhjKCl9LHhjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuWWMpZm9yKHZhciBiPTA7Yjx0aGlzLlljLmxlbmd0aDtiKyspdGhpcy5ZY1tiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5NY3x8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuQ2EoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLnBnKCEwKSx0aGlzLnhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLlpkJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy51ZT0hMH0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5GYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkZiLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LmJpbmQodGhpcyk7dGhpcy5UZCgpLktnKHRoaXMpfSx0ZDpmdW5jdGlvbigpe3RoaXMuUC5ZYiYmIXRoaXMua2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChrLmduLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5DYSgpfSxDYTpmdW5jdGlvbihhKXtpZighdGhpcy5LZClpZih0aGlzLktkPSEwLHRoaXMubS4kYXx8dGhpcy5tLlBiKXt0aGlzLkFiPXRoaXMuQ2M9ITE7dHJ5e3RoaXMuaGQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5uZD0hMTt0cnl7dGhpcy5mLmFoKCl9Y2F0Y2goZSl7fXRoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5EYj0hMTt0aGlzLlRkKCkuRWcoKTt0aGlzLm0uJGEmJnRoaXMubS5vcmlnaW4ubmUoKTt0aGlzLm0uUGImJihhP3RoaXMubS5vcmlnaW4ucWcoKTp0aGlzLkxkKCkpfWVsc2UgdGhpcy5MZCgpfSxjdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuJGQoKT90aGlzLkxnKCk6dGhpcy51ZChhKSl9LHVkOmZ1bmN0aW9uKGEpe3RoaXMuQWI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLiRkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHx0aGlzLlAubmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUC5uZigpKTt0aGlzLm0ub3JpZ2luLkJmKHgud2QpfSxRZTpmdW5jdGlvbigpe2lmKHRoaXMueXYpdGhpcy5DYSgpO2Vsc2V7dGhpcy5EYj0hMDt0aGlzLmYudS5sYiYmIXRoaXMuR2UmJnRoaXMuZi51LmxiKCkmJmUuRChrLktjLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLkR2KGEpO3ZhciBiPSIiO2lmKHRoaXMubS5FZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PZyk7YyYmKGI9dGhpcy5tLkVlLWEsMDxiP2I9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYik6KGI9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKSx0aGlzLm5kfHwodGhpcy5uZD0hMCxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGsubm4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLm0uJGE/KHRoaXMuQWI9dGhpcy5DYz0hMSx0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMubmQ9ITEsdGhpcy5mLmFoKCksdGhpcy5tLm9yaWdpbi5uZSgpKTp0aGlzLkNhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9Yil9dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsZS5JZih0aGlzLm0uZHVyYXRpb24tYSkpKTt0aGlzLnljPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxMZzpmdW5jdGlvbigpe3RoaXMuWGI9ITA7dGhpcy5yYT10aGlzLmYuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuRXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5mLkM9YTt2YXIgYj10aGlzLmYuQyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5mLmxjKCk7dGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyk7dGhpcy5kYS5hcHBlbmRDaGlsZChiKTt0aGlzLmVoKCk7dGhpcy5maCgpO3RoaXMuUWQ9c2V0SW50ZXJ2YWwodGhpcy5Lby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMubS5NLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5tLk1bY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUDtoLm9hJiZoLmlzRW5hYmxlZCYmIWguZ2MoKSYmKGU9aC5KYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LEtvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLm0uZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5RZCksdGhpcy50ZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLlFlKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLlFkKSwKdGhpcy51ZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFlnOmZ1bmN0aW9uKCl7dGhpcy52Z3x8KHRoaXMudmc9ITAsdGhpcy5RY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LER2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuWmd8fHRoaXMua2J8fCgwPT1hJiYodGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSksdGhpcy51ZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5aZD0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5ZZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuWWcoKX0uYmluZCh0aGlzKSksCnRoaXMuWGImJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLmtifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS5EKGsuam4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLkQoay5wbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWGImJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5ZYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuUWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQoay5obix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxhPT0KTWF0aC5mbG9vcih0aGlzLm0uZHVyYXRpb24vMikmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUuRChrLmxuLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLm0uZHVyYXRpb24vNCkmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLkQoay5ybix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxlLkQoay5zbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWmc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMua2Ipe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9CnRoaXMuS3EodGhpcy5tLkFhLGEpO2MubGVuZ3RoOyl0cnl7dmFyIGY9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMub2QuaW1wcmVzc2lvbnMmJmUuUnIoZi51cmwsdGhpcy5vZC5pbXByZXNzaW9ucyk/dGhpcy5mZShmLnVybCxmLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5EKGsua24sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpLHthZElkOnRoaXMub2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9KX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmZlKGYudXJsLGYudHlwZSl9Y2F0Y2goaCl7fWJ8fCh0aGlzLm0uQWE9dGhpcy5ycCh0aGlzLm0uQWEsYSkpfX0sZmU6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5QLkdhKGEpLGMmJmEudm4oYyksZnx8KGY9dGhpcy56ZiksdGhpcy5QLklhKGEsZix0aGlzLnpmLCExLCEwKSl9LEtxOmZ1bmN0aW9uKGEsCmIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHJwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyl9LGdoOmZ1bmN0aW9uKCl7ZS5EKGsuWm8sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7IXRoaXMuUWMmJmUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuc3EoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5tLkhjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMubS5IYywKdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIil9fSxlaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsCmUuSWYoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuUC5FYyYmKGI9dGhpcy5QLkVjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sYWM6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sa2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGZoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5pcDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPQoicmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLmRkO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF2LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2MuaWQ9dGhpcy5tZTtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnp2LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTsKZi5pZD10aGlzLk9nO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLm0uRWUmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz0KdGhpcy5kYS5hcHBlbmRDaGlsZChhKTt0aGlzLmYudS52YSYmdGhpcy5mLnUudmEoKSYmdGhpcy5wZygpO3RoaXMuYmMoKX19LGJjOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbGQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sQXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTt0aGlzLmYuQy5wYXVzZWQ/KHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSk6KHRoaXMuZi5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQoay5mZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTsKdGhpcy5mLkMucGF1c2VkfHwodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmZmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSx3dTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZCYmKHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LHp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tZSk7dGhpcy5mLkMubXV0ZWQ/KHRoaXMuZi5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOgoodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxwZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWUpO3RoaXMuZi5DLm11dGVkfHwodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxGYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5GYik7dGhpcy5NY3x8dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LApMZDpmdW5jdGlvbigpe3RoaXMuTWM9ITA7dGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5IYSYmdGhpcy55Y3x8InBvc3Ryb2xsIj09ZS5IYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuZi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmYubGMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpOwpiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTWQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5NZCgpfWVsc2UgdGhpcy5NZCgpfSxNZDpmdW5jdGlvbigpe3RoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5mLnh1KCk7dGhpcy5EYj0hMTtlLkQoay5ocCx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMuVGQoKS5FZygpfSxUZDpmdW5jdGlvbigpe3ZhciBhPQpudWxsO3RoaXMuZiYmdGhpcy5mLnUmJihhPXRoaXMuZi51KTtyZXR1cm4gYX0sJGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxsZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLmJnKHRoaXMudmlkZW8sYSk/dGhpcy53dSgpOnRoaXMucWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGYoKX0uYmluZCh0aGlzKSwxMDApKX0sVDpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMubSYmKGEuY2xpY2t0aHJvdWdoPXRoaXMubS5IYywKYS5kdXJhdGlvbj10aGlzLm0uZHVyYXRpb24sYS5hZFBvZD10aGlzLm0uJGEsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSx6ZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5sanx8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbT10aGlzLmFbNl07dGhpcy5Mdj10aGlzLmFbM107dGhpcy5hcD10aGlzLmFbN107dGhpcy5VdD10aGlzLmFbM107dGhpcy5tcT10aGlzLmFbM107dGhpcy5LaD10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLmJwPWI7Yi5wcm90b3R5cGU9e2RtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbTp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHY6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5hcDp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVXQ6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1xOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2g6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLmJwfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5kbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkxhPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUWI9dGhpcy5SYj0hMTt0aGlzLlNlPSIiO3RoaXMuUmU9ITE7ZCYmZC5lbXB0eT90aGlzLnVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLnRtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLndmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS50Zih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5wZChhKSkrIiZ0eXBlPWpzIiwKYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy50cy5iaW5kKHRoaXMpLHRoaXMucXMuYmluZCh0aGlzKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09CmUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5MYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYKInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6LTF9KTtyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3RoaXMubXUoYSk7dHJ5e3RoaXMuTGE9YS5yZXNwb25zZVhNTCx0aGlzLkxhfHwodGhpcy5MYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5KZigpO3RoaXMuUmI9dGhpcy5KZSgpO3RoaXMuUWI9dGhpcy5TZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnFjLHtlcnJvcjp0aGlzLlJlP0UueGQ6RS5aZX0pKX0sdXM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTGF8fCh0aGlzLkxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPXRoaXMuSmYoKTt0aGlzLlJiPXRoaXMuSmUoKTt0aGlzLlFiPXRoaXMuU2coKTt0aGlzLlcubGVuZ3RoP3RoaXMuaWMoKTp0aGlzLmdhKHRoaXMuRGEoeC5xYywKe2Vycm9yOnRoaXMuUmU/RS54ZDpFLlplfSkpfSxxczpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlllLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLldyKCk/dGhpcy5udigpPyhhKyssbmV3IGIodGhpcyx0aGlzLlNmKCksZyx7QWRTeXN0ZW06dGhpcy5xcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5hZikpOihhPTAsdGhpcy5YdigpJiZ0aGlzLnNlKHRoaXMua3AoKSkpfSxuZTpmdW5jdGlvbigpe3RoaXMuUmI/KHRoaXMuUmI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQubmUoKX0scWc6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLlFiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLmljKCkpOnRoaXMucGFyZW50LnFnKCl9LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3YoKT90aGlzLmp2KCk/ITA6KC0xIT10aGlzLiRiKCk/CnRoaXMuZ2EodGhpcy5EYSh4LlVlKSk6dGhpcy5nYSh0aGlzLkRhKHguaGkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnFjLEUuJGUpKSwhMSl9LHNlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5qZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlJiO2EuUGI9YS5QYj9hLlBiOnRoaXMuUWI7dGhpcy5wYXJlbnQuc2UoYSl9LGtwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy4kYigpO2EuTT10aGlzLk9mKCk7YS5IYz10aGlzLnRxKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5wcSgpO2EuRWU9dGhpcy5JcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguVWUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLnZxKCkpOmIuQWEuY29uY2F0KHRoaXMuQ3EoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5CYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LkJiJiYKdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0sQmY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxrdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2YoKS5sZW5ndGh9LGp2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy4kYigpfSxKZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuSmUoKSYmKGE9ITApO3JldHVybiBhfSxtdTpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuU2U9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLlJlPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFdyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5TZigpLmxlbmd0aH0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxxcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNkKHRoaXMuWiwiQWRTeXN0ZW0iKX0samU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwiRXJyb3IiXSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0KYS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx0cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxPZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLApEYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iikscng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSxwcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7CmEmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5XYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sJGI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LElxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLApkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxVZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5XYyhhKToiIn0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBVPWMudG18fFU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmtxPXRoaXMuYVs3XTt0aGlzLkNwPXRoaXMuYVs5XTt0aGlzLk1wPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HbDp0aGlzLmpxKGEpfSxqcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3E6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkNwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW46dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5odXx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkZsKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMuSGM9IiI7dGhpcy5SPXRoaXMuUGI9dGhpcy4kYT0hMTt0aGlzLm9yaWdpbj1udWxsfWMubWw9YjtiLnByb3RvdHlwZT17Y3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9CnRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBvYj1jLm1sfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMTBdO3RoaXMuVG49dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzNdO3RoaXMuZXY9dGhpcy5hWzZdO3RoaXMuams9dGhpcy5hWzVdO3RoaXMuaGo9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbNl19Yy5xbz0KYjtiLnByb3RvdHlwZT17enI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFyOnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ubjp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWk6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Mczp0aGlzLmR2KGEpfSxkdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXY6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmprOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5oajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMucW98fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLnpyKDQpOwp2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGhpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxxYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxhZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFllOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCmd4Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxVZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17WmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sJGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0saXg6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRnQ9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzhdO3RoaXMudmg9dGhpcy5hWzZdO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbN119Yy5ndD1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnQ6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZbTp0aGlzLnVoKGEpfSx1aDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmg6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlB0OnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXQ6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBzYj1jLmd0fHxzYixhZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQuRXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5PYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLlJpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5SaXx8cGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMuWGo9dGhpcy5hWzFdO3RoaXMuR3I9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuQXA9dGhpcy5hWzhdO3RoaXMueXc9dGhpcy5hWzNdO3RoaXMuZHg9dGhpcy5hWzddO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLlJvPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsyXX1jLkNpPWI7Yi5wcm90b3R5cGU9CntDaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGg6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3I6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNqOnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lajp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnl3OnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5keDp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaGw6dGhpcy5RbyhhKX0sUW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sbzp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciB0Yj1jLkNpfHx0YixiZD1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5DaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlRhPWEuS2YoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuZmc9ITE7dGhpcy5kYz1bXX1jLnNpPWI7Yi5wcm90b3R5cGU9e0dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCwKZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdxKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5QcihhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sJHU6ZnVuY3Rpb24oKXt0aGlzLmZnPSEwfSxhaDpmdW5jdGlvbigpe3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sd2c6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQoay5LYyx0aGlzLnUuQigpKX0seHU6ZnVuY3Rpb24oKXt0aGlzLmZnfHwodGhpcy51LnBsYXkoKSxlLkQoay5MYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYKKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5UYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlRhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuVGEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5HYiYmdGhpcy51LkdiKCk/dGhpcy51LktmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2MuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LFByOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGNjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudXEodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHwKYi5wb3NpdGlvbiE9dGhpcy5VYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5VYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuVWEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuVWEud2lkdGgmJjA8dGhpcy5VYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLldkKCk7cmV0dXJufXRoaXMuVWE9Yjt0aGlzLnUuR2IoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5jYy5iaW5kKHRoaXMpLDEwKX0sdG46ZnVuY3Rpb24oYSl7dGhpcy5kY3x8KHRoaXMuZGM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmRjLnB1c2goYSl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zaXx8TyxDPVtdLHViPTA7MTAwPnViO3ViKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixCKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdD10aGlzLmFbN107dGhpcy5Haz10aGlzLmFbNF07dGhpcy53dj10aGlzLmFbMl07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbNV19Yy56dD1iO2IucHJvdG90eXBlPXtDdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRHQ6dGhpcy5GayhhKX0sRms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdrOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Y6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkttOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6CnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgdmI9Yy56dHx8dmIsY2Q9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2QuQ3QoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuUyhhKTt0aGlzLkRlKGIpO3RoaXMueGYoKX0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5FYSgpLGE9dGhpcy52aWRlb1RhZzthfHwKKChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlUoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhmKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LCRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkVhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgd2I9Yy5aa3x8d2I7KGZ1bmN0aW9uKGMpe2MuWWs9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy55Yj10aGlzLnlifHwhMTt0aGlzLmVmPXRoaXMuaGY9dGhpcy5YZj10aGlzLmphPXRoaXMuTWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5mcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELAoiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk1lPSEwO3RoaXMuWGYmJnRoaXMucWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLkRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLlhmPSEwO3RoaXMucWYoKX0uYmluZCh0aGlzKSk7dGhpcy5tZigpfSxxZjpmdW5jdGlvbigpe2lmKCF0aGlzLnliKXt0aGlzLkZjKCk7aWYoIXRoaXMuTWUmJiF0aGlzLkZjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5NZSYmdGhpcy5lZiYmIXRoaXMuaGYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLAoxMDApfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LFBmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LG1mOmZ1bmN0aW9uKCl7aWYodGhpcy5GYygpKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuaGY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5lZj1iLm54fXRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1mKCl9LmJpbmQodGhpcyksMTAwKX0sdXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh4KCk6ITF9LCRiOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi4kYigpOi0xfSxEcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxmcTpmdW5jdGlvbihiLGEpe3RoaXMueWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy55Ynx8MzAyPT10aGlzLnliP3RoaXMuamE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnliKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfSxKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT8odGhpcy5vKCksdGhpcy5uYSgpKTpiLiRjKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLkRxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHhiPWMuWWt8fHhiOyhmdW5jdGlvbihjKXtjLiRrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sVXI6ZnVuY3Rpb24oKXt3aW5kb3cuT08ucWwuYW4uWm0/d2luZG93Lk9PLnFsLmFuLlptLmx4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVyKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLnhhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRmEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyB3YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgeGIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHliPWMuJGt8fHliLHpiPW5ldyB5YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbNV07dGhpcy5YbD10aGlzLmFbNF07dGhpcy5ieD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs4XX1jLllxPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhsOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ieDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6CnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NaDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuWXF8fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlhyKDQpOyhmdW5jdGlvbihjKXtjLk5sPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEdiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5ObHx8VjsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LkRkKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS5EZCgiIyIrYiwiYWRzTWFuYWdlckxvYWRGYWlsIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksCjFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5kdChhKX0uYmluZCh0aGlzKSk7eS5VcSgpfSxkdDpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufX10aGlzLmwoImFkZXJyb3IiLGEpO3RoaXMudygpfX0pfSkoYyk7dmFyIFc9Yy5NbHx8VzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUud3AoYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuSChkKSl7dGhpcy5KKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5BKTtmLmIoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxoPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5jZHx8Cih0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxvdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLmhjfHwodGhpcy5oYz1bXSksdGhpcy5oYy5wdXNoKGIpLHRoaXMudnUoKSYmKHRoaXMuRmcoKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LFVxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkub3YoYil9fSl9KShjKTt2YXIgQmI9Yy5PbHx8QmIseT1uZXcgQmIocSk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHQ9dGhpcy5hWzFdO3RoaXMuYW09dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzNdO3RoaXMuZnQ9dGhpcy5hWzJdO3RoaXMuZm89dGhpcy5hWzddO3RoaXMuR209dGhpcy5hWzVdO3RoaXMueGw9dGhpcy5hWzNdO3RoaXMuemw9dGhpcy5hWzRdO3RoaXMuYnI9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbNV19Yy5wdj1iO2IucHJvdG90eXBlPXtLdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTHQ6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XbTp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnQ6dGhpcy5lbyhhKX0sZW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mbzp0aGlzLkZtKGEpfSxGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206CnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bDp0aGlzLnlsKGEpfSx5bDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuemw6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJyOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5wdnx8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuV2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLldofHxEYjsoZnVuY3Rpb24oYyl7Yy5YaD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuYXV8fCh0aGlzLmF1PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlhofHwKRWI7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRmI9Yy5ZaHx8RmIsR2I9bmV3IEZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNpPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsyXTt0aGlzLnFyPXRoaXMuYVs5XTt0aGlzLkZzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzZdfWMuTG49YjtiLnByb3RvdHlwZT17Ymk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNpOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucXI6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5Mbnx8SGIsZmQ9bmV3IEhiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLmJpKDQpOyhmdW5jdGlvbihjKXtjLnltPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMueW18fEliOyhmdW5jdGlvbihjKXtjLnhtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMua2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLm9xfHwodGhpcy5ZZigpLAp0aGlzLm9xPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm8oKTp0aGlzLmtmPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMucygpKToodGhpcy5rZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sWWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnJxKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZZigpfS5iaW5kKHRoaXMpLDUwKX0sRng6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueG18fEpiOyhmdW5jdGlvbihjKXtjLnptPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEtiPWMuem18fEtiLExiPW5ldyBLYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Faz10aGlzLmFbOV07dGhpcy5Sdj10aGlzLmFbMTBdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMudXY9dGhpcy5hWzVdO3RoaXMub3Q9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbNl19Yy5Xbz1iO2IucHJvdG90eXBlPXtEazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWs6dGhpcy5RdihhKX0sUXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sdjp0aGlzLmttKGEpfSxrbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG06dGhpcy50dihhKX0sdHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnV2OnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciBNYj1jLldvfHxNYixnZD1uZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1nZC5Eayg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpOwpiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgTmI9Yy5aanx8TmI7KGZ1bmN0aW9uKGMpe2MuWWo9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuamgoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLkdmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLApmdW5jdGlvbigpe3RoaXMuR2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMucW4oKX0uYmluZCh0aGlzKSksdGhpcy5raD0hMSx0aGlzLnd3PTFFMyx0aGlzLnlnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxHZjpmdW5jdGlvbigpe3RoaXMueWcuZG9uZXx8KHRoaXMueWcuZG9uZT0hMCx0aGlzLmtoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qaCgpfS5iaW5kKHRoaXMpLHRoaXMud3cpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2gpO3RoaXMubygpfSxqaDpmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sTWY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHdhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5NZihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLk1mKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLllqfHxPYjsoZnVuY3Rpb24oYyl7Yy4kaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmCndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBQYj1jLiRqfHxQYixRYj1uZXcgUGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLkhzPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVs4XTt0aGlzLlZ1PXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzRdfWMuJHA9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZHI6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZ1OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgUmI9Yy4kcHx8UmIsaGQ9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLlR3KDQpOyhmdW5jdGlvbihjKXtjLklsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBTYj1jLklsfHxTYjsoZnVuY3Rpb24oYyl7Yy5IbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLAphKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpO3RoaXMuVmIoKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5jZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwKMTApfSxjZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgVGI9Yy5IbHx8VGI7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJgohd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLkpsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzRdO3RoaXMudnc9dGhpcy5hWzEwXTt0aGlzLkNrPXRoaXMuYVs0XTt0aGlzLlFrPXRoaXMuYVs2XTt0aGlzLlZoPXRoaXMuYVsyXTt0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLlhuPXRoaXMuYVsyXTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzVdfWMuZmo9YjtiLnByb3RvdHlwZT17VW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQ246dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZ3OnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dazp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWs6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZoOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5XbihhKX0sV246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhuOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMuZmp8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PQppZC5Vbyg0KTsoZnVuY3Rpb24oYyl7Yy5CbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuUyhiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy50ZT0hMX0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZHUoKX0uYmluZCh0aGlzKSw1MDApfSxkdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7CnJldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy50ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50ZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFh1OmZ1bmN0aW9uKCl7dGhpcy50ZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBYYj1jLkJsfHxYYjsoZnVuY3Rpb24oYyl7Yy5BbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuTmI9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk5ifHwodGhpcy5OYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsCiJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk5ifHx0aGlzLk5iKyssdGhpcy5OYjw9dGhpcy5Kcz8odGhpcy5OYisrLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSl9LHM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlh1KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBZYj1jLkFsfHxZYjsoZnVuY3Rpb24oYyl7Yy5DbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSwKdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWWIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBaYj1jLkNsfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUWk9dGhpcy5hWzNdO3RoaXMuQmg9dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVs5XTt0aGlzLlBuPXRoaXMuYVszXTt0aGlzLnVyPXRoaXMuYVs0XTt0aGlzLlpsPXRoaXMuYVsxXTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVs0XX1jLm9tPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RaTp0aGlzLkFoKGEpfSxBaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQmg6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRoOnRoaXMuUXUoYSl9LApRdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnU6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBuOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51cjp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWmw6dGhpcy5IcChhKX0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLklwOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIGFjPWMub218fGFjLGpkPW5ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLlBpKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT0KdGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBiYz1jLnNsfHxiYzsoZnVuY3Rpb24oYyl7Yy5ybD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBiKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuZXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuVmMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm1zKCk6dGhpcy5WYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZigpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5kZigpfHx0aGlzLnMoITApfSxtczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmMoKTshYi5tYSYmYi5XJiZiLmt4JiZiLm14JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlZjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwxMDApfSxWYzpmdW5jdGlvbigpe2lmKCF0aGlzLnVnKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy51Zz1iW2NdKTtyZXR1cm4gdGhpcy51Z30sY2U6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuVmMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKToKdGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNjPWMucmx8fGNjOyhmdW5jdGlvbihjKXtjLnRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGJjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBjYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBkYz1jLnRsfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmNtPXRoaXMuYVsxMF07dGhpcy51bz10aGlzLmFbOV07dGhpcy5CdD10aGlzLmFbN107dGhpcy5jbz10aGlzLmFbNV07dGhpcy5Haj10aGlzLmFbMTBdO3RoaXMucmg9dGhpcy5hWzVdO3RoaXMuY3M9dGhpcy5hWzFdO3RoaXMuaXE9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbMl19Yy5Fcj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY206dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVvOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CdDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucmg6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNzOnRoaXMuaHEoYSl9LApocTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaXE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLkVyfHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5ibSg0KTsoZnVuY3Rpb24oYyl7Yy5xaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hPwp0aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7CmIhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5xa3x8WDsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy52ZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnZlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMudmUmJmIhPXRoaXMudmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5KeCksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLnBrfHxZOyhmdW5jdGlvbihjKXtjLnJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFkoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5GZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLnJrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuS3UoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUua2cuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlsW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLmtnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVHA9dGhpcy5hWzZdO3RoaXMuT209dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzZdO3RoaXMuaT10aGlzLmFbOF19Yy5haj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5ObShhKX0sTm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5PbTp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYz1jLmFqfHxpYyxsZD1uZXcgaWMoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bGQuU3AoNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlMoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5Tcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX0sCkN1OmZ1bmN0aW9uKGIpe3RoaXMuQmQ9Yn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Tc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkJkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5CZCYmKG5ldyBJKHRoaXMsdGhpcy5CZCkpLmIoKSl9fSl9KShjKTt2YXIgTj1jLmdtfHxOOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5SZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuTXUoKTp0aGlzLnMoITApLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlJkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSwKWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuZm18fEk7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuQ3UodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuaG18fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51dD0KdGhpcy5hWzVdO3RoaXMuYXQ9dGhpcy5hWzVdO3RoaXMuenM9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbOV19Yy5Saz1iO2IucHJvdG90eXBlPXt0dDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF0OnRoaXMueXMoYSl9LHlzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56czp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYz1jLlJrfHxsYyxtZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC50dCg0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy51Zj0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmVhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51Zn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3pvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMudWY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCnt6bzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIG1jPWMubmt8fG1jOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE54OmZ1bmN0aW9uKCl7fSxxdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLlRlKG5ldyBmdW5jdGlvbigpe30pO2EuaHg9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IucXUoYSk7d2luZG93LnB4PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLnB1fHwodGhpcy5wdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLllkfHwodGhpcy5ZZD0xKTtpZigyMDx0aGlzLllkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkthKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuWWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEthOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5BZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSl9LFg6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBuYz1jLm1rfHxuYzsoZnVuY3Rpb24oYyl7Yy5vaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbWMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmthfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBuYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgb2M9Yy5va3x8b2MscGM9bmV3IG9jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sbj10aGlzLmFbMV07dGhpcy5Odz10aGlzLmFbN107dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5PcT10aGlzLmFbMV07dGhpcy5Zbz10aGlzLmFbNV07dGhpcy5hcz10aGlzLmFbM107dGhpcy53az10aGlzLmFbNl07dGhpcy5qbD10aGlzLmFbM107dGhpcy5Vdj10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVsxMF19Yy5OcD1iO2IucHJvdG90eXBlPXtRbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJuOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnc6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklrOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PcTp0aGlzLlhvKGEpfSxYbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW86dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFzOgp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLlR2KGEpfSxUdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVXY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBxYz1jLk5wfHxxYyxuZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Rbig0KTsoZnVuY3Rpb24oYyl7Yy5kaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVShhKTthJiZ0aGlzLlMoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLmRrfHxaOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlVmPTA7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPXRoaXMuZWM9dGhpcy5YYT10aGlzLkJjPSExO3RoaXMuQ2c9ZS5uYigxMCk7dGhpcy5jZygpfSxjZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT0KYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkthKCksITA7dGhpcy5VZisrO2lmKDEwPHRoaXMuVWYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLDEwMCksITF9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiYKZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PQphLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7CmJyZWFrfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuY2t8fGFhOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0KMDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIHJjPWMuZWt8fHJjLHNjPW5ldyByYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbMl07dGhpcy50aj10aGlzLmFbNl07dGhpcy5Qdz10aGlzLmFbN107dGhpcy5GaD10aGlzLmFbMTBdO3RoaXMuSWg9dGhpcy5hWzRdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMud2k9CnRoaXMuYVsxMF07dGhpcy5TbT10aGlzLmFbOV07dGhpcy5tdD10aGlzLmFbM107dGhpcy5Scz10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbMl19Yy52dD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXI6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMuT3coYSl9LE93OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qdzp0aGlzLkVoKGEpfSxFaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZoOnRoaXMuSGgoYSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaDp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndpOnRoaXMuUm0oYSl9LFJtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TbTp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXQ6CnRoaXMuUXMoYSl9LFFzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRjPWMudnR8fHRjLG9kPW5ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLmxyKDQpOyhmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSwkYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdWM9Yy5UaXx8dWM7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLApmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5zKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgdmM9Yy5TaXx8dmM7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB1YyhkKSxkLmthfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB2YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciB3Yz1jLlVpfHx3Yyx4Yz1uZXcgd2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuam09dGhpcy5hWzNdO3RoaXMuTm49CnRoaXMuYVs3XTt0aGlzLnl0PXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVs4XTt0aGlzLnpoPXRoaXMuYVs3XTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLmhrPXRoaXMuYVs5XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmFvPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMucm89YjtiLnByb3RvdHlwZT17aW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmptOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueXQ6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMueWgoYSl9LHloOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aDp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSXI6dGhpcy5nayhhKX0sZ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhrOnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubmk6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgeWM9Yy5yb3x8eWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuaW0oNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHpjPWMuWGl8fHpjOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLm9mKCl9LG9mOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5XaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyB6Yyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5rYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkgoYikpe3RoaXMuSihiKTsobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5ZaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkduPXRoaXMuYVs5XTt0aGlzLmx1PXRoaXMuYVs0XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLklpPXRoaXMuYVsxMF07dGhpcy52aj10aGlzLmFbOF07dGhpcy5rcj10aGlzLmFbMV07dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Saj10aGlzLmFbOF07dGhpcy5NaT10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs2XX1jLnlwPWI7Yi5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuR246dGhpcy5rdShhKX0sa3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmx1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSWk6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3I6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNyOnRoaXMuUWooYSl9LFFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Sajp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRGM9Yy55cHx8RGMscWQ9bmV3IERjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLkZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmVnPXRoaXMuaGc9dGhpcy5nZz0hMTt0aGlzLmVkPVtdO3RoaXMueWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIENjP251bGw6Q2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHNjP251bGw6c2MsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFVhP251bGw6VWEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBaYT9udWxsOlphLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOgplYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgaGM/bnVsbDpoYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgR2I/bnVsbDpHYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yz9udWxsOnhjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaWI/bnVsbDppYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBQYT9udWxsOlBhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFhP251bGw6cWF9fWMub2w9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5GcShhKTpbXSxiO3RoaXMuaGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2c9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuR2coYil9ZWxzZSBmb3IoYyBpbiB0aGlzLnllKXtpZih0aGlzLmVnKWJyZWFrO2I9dGhpcy55ZVtjXTt0aGlzLk9lKGIpJiYodGhpcy5lZC5wdXNoKGIpLHRoaXMuR2coYikpfX0sT2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxGcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjOwppZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMueWVbY10sdGhpcy5PZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxHZzpmdW5jdGlvbihhKXt0aGlzLk9lKGEpJiZhLmIoKX0sWnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdnKWZvcih0aGlzLmVnPSEwLGE9MDthPHRoaXMuZWQubGVuZ3RoO2ErKyl0aGlzLmVkW2FdLnRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWRbYV0udGIpfX19KShjKTt2YXIgRWM9Yy5vbHx8RWMsTD1uZXcgRWM7TC5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzFdO3RoaXMuUnQ9dGhpcy5hWzRdO3RoaXMuZ3I9dGhpcy5hWzVdO3RoaXMuTnQ9dGhpcy5hWzldO3RoaXMuYWk9dGhpcy5hWzNdO3RoaXMuYms9dGhpcy5hWzEwXTsKdGhpcy5CdT10aGlzLmFbNF07dGhpcy55cj10aGlzLmFbOV07dGhpcy5PaD10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVs5XX1jLmJuPWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5naTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5OdDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWk6dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJrOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CdTp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueXI6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9oOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEZjPWMuYm58fEZjLHJkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLmZpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlpiKGsuWXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5aYihrLlZzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ry53aWR0aD0xO0cuaGVpZ2h0PTE7Ry5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEcpO3ZhciBzZD1HLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5mYygpO0guWmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5aZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csCkguSnIoKSx7aWQ6dGR9KX0sNTAwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZ4PXRoaXMuYVsyXTt0aGlzLkV3PXRoaXMuYVsxXTt0aGlzLm9zPXRoaXMuYVs5XTt0aGlzLk9pPXRoaXMuYVs1XTt0aGlzLlhwPXRoaXMuYVs5XTt0aGlzLlpuPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzEwXX1jLlN3PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5meDp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXc6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9zOnRoaXMuTmkoYSl9LE5pOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PaTp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5abjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIEdjPWMuU3d8fEdjLHVkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLmV4KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5BZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuYWQ9MDt0aGlzLk5hPSIiO3RoaXMuZmQ9W107dGhpcy5nZD0wO3RoaXMuQmc9ITE7dGhpcy53ZT1bXX1jLm9oPWI7Yi5wcm90b3R5cGU9e0p1OmZ1bmN0aW9uKGEpe3RoaXMuQWc9YX0samQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFdTpmdW5jdGlvbihhKXt0aGlzLldhPWF9LER1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxrYzpmdW5jdGlvbihhLGIpe2UuamIoIndlbHQuZGUiKSYmZS5NYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5XYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLk5yKCkpdGhpcy5XYS5jKHRoaXMuV2EuWGMsdGhpcy5XYS5CYSx0aGlzLldhLnhlLGZ1bmN0aW9uKCl7dGhpcy5rYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLldhLk5jKTtlbHNlIGlmKHRoaXMuV3EoKSl0aGlzLnp1KGZ1bmN0aW9uKCl7dGhpcy5rYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuJHUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLkpnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklzKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5lZSYmKGM9dGhpcy5wbGF5ZXIuZWUoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZ2UoYSwKYyxmKTt0aGlzLnBsYXllci5LZyhsKX19LE5yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuYWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5hZC5nZXRUaW1lKCksdGhpcy5hZD1hLDNFNTxiPyEwOiExO3RoaXMuYWQ9YTtyZXR1cm4hMX0sVHU6ZnVuY3Rpb24oKXtlLkNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQ2YoYSkpP3RoaXMua2MoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGsuTGMsdGhpcy5wbGF5ZXIuQigpKSl9LFN1OmZ1bmN0aW9uKGEpe2UuQ2UoInBvc3Ryb2xsIik7aWYoIXRoaXMuQWcpe3RoaXMuSnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLkNmKGMpKT90aGlzLmtjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5MYyx0aGlzLnBsYXllci5CKCkpKX19LENmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxzdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk91KHRoaXMuU3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZmEoKX0sbWQ6ZnVuY3Rpb24oYSl7ZS5DZSgibWlkcm9sbCIpO2lmKCF0aGlzLm1nKXt0aGlzLm1nPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmtjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChrLkxjLHRoaXMucGxheWVyLkIoKSkpfX0scnU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5JdSh0aGlzLm1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmtlKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlR1KCk7dGhpcy5wbGF5ZXIua2UmJnRoaXMucnUoKTt0aGlzLnN1KCl9LHR1OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuZmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLlZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5nZD10aGlzLmZkLmxlbmd0aH0sV3E6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLmdkJiYoYT0hMCk7cmV0dXJuIGF9LHp1OmZ1bmN0aW9uKGEpe3RoaXMuQmc9YTtmb3IoYT0wO2E8dGhpcy5mZC5sZW5ndGg7YSsrKXRoaXMuZmRbYV1bImZ1bmN0aW9uIl0odGhpcy5ndS5iaW5kKHRoaXMpKX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5nZC0tO2EmJnRoaXMud2UucHVzaChhKTswPj10aGlzLmdkJiZ0aGlzLkJnKCl9LElzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLndlLmxlbmd0aDtjKyspYj10aGlzLndlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBoYT1jLm9ofHxoYSxTPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxMF07dGhpcy5saT10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVszXX1jLmZrPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLk52OnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5saTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZmt8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLk12KDQpfSkuY2FsbChhaXRoYWlOZ0llYmVpbG9vLGFpdGhhaU5nSWViZWlsb28pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.164.213 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
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
Tue, 27 Nov 2018 15:48:15 GMT
Last-Modified
Tue, 27 Nov 2018 15:04:04 GMT
Server
AmazonS3
x-amz-request-id
7EA9EE064D9EC616
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
jLwylw0sLZiJ+6HfDIZJGYFURGCmu3szoFwaIwxYvwT75HJ1ZMbQfSxw7kTzOJkHFwlAIHFlepc=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=7986866775
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpdGhhaU5nSWViZWlsb289YWl0aGFpTmdJZWJlaWxvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kucGV8fCh5LnBlPTApO3kucGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5wZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk1hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5KZyhsKSxhLmdlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLnhvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLktjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuRXUobSk7YS5EdShsKTthLnR1KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubGs9dGhpcy5hWzldO3RoaXMuSnY9CnRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLkxsPXRoaXMuYVsxXTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLm1wPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuU3Y9YjtiLnByb3RvdHlwZT17a2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxrOnRoaXMuSXYoYSl9LEl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kdjp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG86dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5idihhKX0sYnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmN2OnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5tcDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgaWE9Yy5Tdnx8aWEsSWM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SWMua2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueG89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5yZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmZ1LmJpbmQodGhpcykpfWMubmo9YjtiLnByb3RvdHlwZT17cmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sem46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0sCnBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LHphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxmdTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5ldShhLmRhdGEpfSxldTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsCmNiOmJ9KX0sdGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55cShhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuamcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx5cTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYKKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0seG46ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLm5xKGEpKXJldHVybjsoYj10aGlzLnRmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxucTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxFZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LExmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxZdTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKYWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxiZzpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXQpcmV0dXJuITE7Yz10LmhlaWdodCp0LndpZHRoO2Q9dC53aWR0aDtmPXQuaGVpZ2h0OwowPnQudG9wJiYoZis9dC50b3ApO3QuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dC5sZWZ0JiYoZCs9dC5sZWZ0KTt0LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXQucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrCi4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxWZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHQ9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsCm09MzI4NTM3NzUyMCxuLGssdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPApwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXQ7az1BO3c9bDtxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmCjQyOTQ5NjcyOTU7dD10K24mNDI5NDk2NzI5NTtBPUErayY0Mjk0OTY3Mjk1O2w9bCt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHQpK2IoQSkrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHQsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix0PWMmNjMsaXNOYU4oZik/ZT10PTY0OmlzTmFOKGMpJiYodD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh0KTtyZXR1cm4gYn0sVHI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx3ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHQ9ITEsQT0hMSxrPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuc28/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxBPSF0JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KGt8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXQ7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWs7YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy53ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJgooYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtHaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxaaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxlcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxCbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sb286ZnVuY3Rpb24oKXtyZXR1cm4gYS5HaCgpfHxhLlpoKCl8fGEuZXIoKXx8YS5hbCgpfHxhLkJtKCl9fTtyZXR1cm4gYS5vbygpfSwKSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp7fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRZjpmdW5jdGlvbihhKXthPXRoaXMuSmEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxqYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHdwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LFd1OmZ1bmN0aW9uKGEsCmIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LElmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy4kZyhiKSsiOiIrdGhpcy4kZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LENlOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYiwKe2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxaYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5SYyhiLGQpKTtiJiYoaD1rLlJjKGEsYikpO2YmJihoPWsuUmMoaCxmKSk7YyYmKGg9ay5SYyhoLGMpKTtlLlpiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLm5jfHwodGhpcy5uYz17fSk7dGhpcy5uY1tmXXx8Cih0aGlzLm5jW2ZdPTApO3RoaXMubmNbZl0rKzsxMDx0aGlzLm5jW2ZdfHwoZj1tLnplKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxtLkdhKGYsITApLGY9bS5HYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixtLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxoZTpmdW5jdGlvbigpe20mJm0uYWE/bS5pc0VuYWJsZWQmJm0uTG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSw1MDApfSxTZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLldjKGEpOiIifSxXYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlVkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sCnlvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuYWUoYSl8fHRoaXMuVnIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LkhnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuRWYoYSkpcmV0dXJuIHRoaXMuRWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk1hKGEsYi51YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5aYygpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy54bihjLGEpO3JldHVybiBjfSxNYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHQpe3ZhciBrPWh8fG07aD0hMDt0JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suR2EoYSxoKTtoPWsuR2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT0KZFtxXTtyZXR1cm4gay5JYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoYSxiLGQsZixjLGssZSx0KX0uYmluZCh0aGlzKSw1MDApfSxqZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdD0hMDtlJiYodD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHQpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sc3M6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMubWMpZm9yKHZhciBjIGluIHRoaXMubWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5tY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuemIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxrZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKYy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnNzKGYuWmMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1jPWF9LFZ3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5NYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIiwKZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxwbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLAphPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFJyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLm5qfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5zeD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1qPWI7Yi5SYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuU3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHc9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07CmIuYXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnBuPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLmhuPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5sbj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ybj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuZ249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Iuam49e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlRzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmJxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Bdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5abz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLmhwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5MYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5LYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Iubm49e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLm1uPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5nZj17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuZmY9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Iuc249e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmtuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5Zdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Wcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMubWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzddO3RoaXMud3I9dGhpcy5hWzNdO3RoaXMudGg9dGhpcy5hWzRdO3RoaXMuUHM9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbMTBdfWMueGk9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLndyOnRoaXMuc2goYSl9LHNoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy50aDp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBqYT1jLnhpfHxqYSxKYz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1KYy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLm9qPWI7Yi5wcm90b3R5cGU9e1ZkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4Iil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFNjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5TYyhhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5TYyhNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGZjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVmQodGhpcy5mYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLlNjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxKcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZjKCkrIjIifSxaZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlZkKHRoaXMuQnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5TYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMub2p8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzEwXTt0aGlzLktrPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNl07dGhpcy5WcD10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs1XX1jLk1yPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eczp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2s6dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcDp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkJzOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIGthPWMuTXJ8fGthLEtjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLkNzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5UZT1ifSkoYyk7dmFyIEs9Yy5UZXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mbj10aGlzLmFbNV07dGhpcy5Waj10aGlzLmFbNl07dGhpcy5NbT10aGlzLmFbNV07dGhpcy5rbz10aGlzLmFbMl07dGhpcy5ZdD10aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbOF07dGhpcy5laj10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs2XX1jLnp3PWI7Yi5wcm90b3R5cGU9e2VuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5mbjp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlZqOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NbTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLll0OnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWo6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYT1jLnp3fHxsYSxMYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5lbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLm5sPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueWE9e307dGhpcy5BPW51bGw7dGhpcy5qYz0KMTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy5GdShiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKTowPnRoaXMueGEmJih0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYj50aGlzLnhhPyEwOiExfSxGZzpmdW5jdGlvbigpe3RoaXMub2I9MH0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZ1OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxBcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmZiKCldPWI7TCYmTC5oZyYmTC5adShiKX0sQXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5GYSh0aGlzLnlhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy55YSlpZihhPT0KdGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxTcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LE94OmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMubmx8fHI7KGZ1bmN0aW9uKGMpe2MucGw9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5qYz0xMDt0aGlzLm9iPTA7dGhpcy54YT01MDt0aGlzLks9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWI7dGhpcy5oYj0iIjt0aGlzLnlmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz0KYSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxPdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxJdTpmdW5jdGlvbihiKXt0aGlzLmxlPWJ9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV9LGtlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5vYjw9dGhpcy54YSYmKHRoaXMub2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmpjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxLZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxQeDpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5YcSgpfHx0aGlzLnVuKCk7dGhpcy5EZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHVuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLnBhKDEwKSl9LFhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LCRjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmthPSEwfSxHYjpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS2c6ZnVuY3Rpb24oYil7dGhpcy5oYj1ifSx5eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhifSxFZzpmdW5jdGlvbigpe3RoaXMuaGI9bnVsbH0sRXg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmhiJiYoYj0hMCk7cmV0dXJuIGJ9LEt4OmZ1bmN0aW9uKCl7dGhpcy55Znx8KHRoaXMueWY9ITApfSxUYzpmdW5jdGlvbigpe3JldHVybiExfSwKdng6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMucGx8fHA7KGZ1bmN0aW9uKGMpe2MucGg9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLkE9dGhpcy5wbGF5ZXI9IiI7dGhpcy5iZj0iMSI7dGhpcy5jZj0iMiI7dGhpcy4kbT0iMyI7dGhpcy5zYz0wO3RoaXMubmc9MzA7dGhpcy54Yj1bXTt0aGlzLlJhPVtdO3RoaXMuT2I9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuamY9dGhpcy5kaD0hMTt0aGlzLnN0YXR1cz10aGlzLnNjO3RoaXMuaWQ9ZS5wYSgxMCk7dGhpcy5qZChiKTt0aGlzLkd1KGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuZGh8fCh0aGlzLmRoPSEwLGUuaGUoKSl9LG9lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaWEoKT8hMToodGhpcy5MdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuV2coKSx0aGlzLmpmPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxsOmZ1bmN0aW9uKGIsYSl7dGhpcy5pYSgpfHwodGhpcy54Yi5wdXNoKGIpLHRoaXMuUmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy54YiYmMDx0aGlzLnhiLmxlbmd0aCYmKHRoaXMueGI9ZS51bmlxdWUodGhpcy54YiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMueGIuam9pbigiLCIpKSk7aWYodGhpcy5SYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlJhLmxlbmd0aDtnKyspdGhpcy5PYlt0aGlzLlJhW2ddLnJlYXNvbl09PQp0aGlzLk9iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuT2JbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuT2JbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksYj10aGlzLlJhW2ddLnJlYXNvbik7dGhpcy5PYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LER4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamZ9LG86ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJmfSxMdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuY2Z9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kbX0scGI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnNjfSxkZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5iZn0sang6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuY2Z9LAppYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5zY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sQXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSx2czpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMucGh8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Y9dGhpcy5hWzZdO3RoaXMuSnQ9dGhpcy5hWzldO3RoaXMuTWs9dGhpcy5hWzNdO3RoaXMubGw9dGhpcy5hWzJdO3RoaXMuemo9dGhpcy5hWzEwXTt0aGlzLml0PXRoaXMuYVs1XTt0aGlzLlZsPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs0XTt0aGlzLlRsPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzEwXX1jLnd0PWI7Yi5wcm90b3R5cGU9e1Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuV3Y6dGhpcy5JdChhKX0sSXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkp0OnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Nazp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpqOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pdDp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVmw6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9wOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5UbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIG5hPWMud3R8fG5hLE1jPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Wdig0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpOwp2YXIgVD1jLnBpfHxUOyhmdW5jdGlvbihjKXtjLm9pPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy52ZD1udWxsO3RoaXMuZHc9MUUzO3RoaXMueGc9bnVsbDt0aGlzLnh2PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5zbyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLmdxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5UcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLlNxKGEsYil9LmJpbmQodGhpcykpO2IudnBFdmVudCYmKGIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5ndyhiKX0uYmluZCh0aGlzKSksYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuaHcoYil9LmJpbmQodGhpcykpKTsKYi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuUnEoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLmZwKGEpfS5iaW5kKHRoaXMpKX0sZnA6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxndzpmdW5jdGlvbihiKXt0aGlzLnZkfHwodGhpcy52ZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaXcoYil9LmJpbmQodGhpcyksdGhpcy5kdykpfSxpdzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCk7dGhpcy53KCl9LGh3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZkKX0sUnE6ZnVuY3Rpb24oYil7dGhpcy5xeChiKTt0aGlzLnhnPW5ldyBEYXRlO3RoaXMueGctdGhpcy5idTx0aGlzLnh2P3RoaXMudygpOnRoaXMubygpfSxUcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmpkKG5ldyBUKGEpKSk7CnRoaXMudygpfSxncTpmdW5jdGlvbigpe30sU3E6ZnVuY3Rpb24oKXt0aGlzLmJ1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIG9hPWMub2l8fG9hOyhmdW5jdGlvbihjKXtjLnJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuRmEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyBvYShnLHRoaXMuQSkpLmIoKSl9fXRoaXMuSSgpfX19KX0pKGMpO3ZhciBwYT1jLnJpfHxwYSxxYT1uZXcgcGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnA9dGhpcy5hWzhdO3RoaXMuaT0KdGhpcy5hWzFdfWMuZmw9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnZwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcmE9Yy5mbHx8cmEsTmM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudXAoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt0aGlzLkRmKCk7dGhpcy5GZigpO3RoaXMuZ3A9ITF9LERmOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuRWI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlOwp0aGlzLlMoYil9LEZmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3ZhciBiPXRoaXMuRWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkViPSEwKTt0aGlzLlUoYSl9fSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmCigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKSl9LGtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMubWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpKX0sbWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmCmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5sZSYmKDAsdGhpcy5sZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LAp2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxUYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuT2p8fHNhOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5zYzt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJgooYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMub2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm5nJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5ncD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEucWUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMub2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmcmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy53Yy5pbmRleE9mKGEpJiYKdGhpcy53Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMud2MubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LHZzOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuUGQ/dGhpcy5QZCsrOnRoaXMuUGQ9MTp0aGlzLk9kP3RoaXMuT2QrKzp0aGlzLk9kPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLll1KGEudmlkZW9UYWcpP2EuRWI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy51Y3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLk9kPnRoaXMuUGQmJihiPSExKSx0aGlzLncoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5EZigpLGEuRmYoKSxhLkVifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHRhPWMuTmp8fHRhOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuSmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5TcihnKXx8KHRoaXMuSihnKSxnPW5ldyB0YShnLHRoaXMuQSksCmcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0seHg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sd3E6ZnVuY3Rpb24oKXt2YXIgYj1lLkphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLlBqfHx1YSx2YT1uZXcgdWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3A9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuVmk9YjtiLnByb3RvdHlwZT17RnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgd2E9Yy5WaXx8d2EsT2M9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLkZwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLkRtfHx4YTsoZnVuY3Rpb24oYyl7Yy5DbT11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB5YT1jLkNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5FbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJgp3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgemE9Yy5FbXx8emEsQWE9bmV3IHphKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh2PXRoaXMuYVs1XTt0aGlzLktwPXRoaXMuYVs3XTt0aGlzLkN3PXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVsyXTt0aGlzLlpzPXRoaXMuYVs5XTsKdGhpcy5QcD10aGlzLmFbNl07dGhpcy5jdD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbMTBdO3RoaXMuUHY9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbM119Yy5HaT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHY6dGhpcy5KcChhKX0sSnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLktwOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddzp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5ZcyhhKX0sWXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpzOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QcDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3Q6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnppOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuUHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLkdpfHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5Hdig0KTsoZnVuY3Rpb24oYyl7Yy52bT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlUoYik6dGhpcy5lYSgpKTp0aGlzLmVhKCl9ZWxzZSB0aGlzLmVhKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgQ2E9Yy52bXx8Q2E7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT10aGlzLmVjPXRoaXMuWGE9dGhpcy5CYz0hMTt0aGlzLkNnPWUubmIoMTApO3RoaXMuYmg9ITA7dGhpcy5HZD10aGlzLldmPSExO3RoaXMuc2coKTt0aGlzLklvKCk7dGhpcy5LYSgpfSxMeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLHR5cGVvZiBiLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuVz9iLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkYsIjsiLHR5cGVvZiBiLkYsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5zYT9iLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLnNhP3R5cGVvZiBiLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi56ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5BZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuRmQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5GZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNnKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxVYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj10aGlzLmdiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5tYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5tYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5tYX0sTmY6ZnVuY3Rpb24oKXtpZighdGhpcy5lYyl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5lYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmVjfSwKUXI6ZnVuY3Rpb24oKXtpZighdGhpcy5WZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5PcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVmY9ITApfXJldHVybiB0aGlzLlZmfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuQmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkJjPSEwKTtyZXR1cm4gdGhpcy5CY30sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuQWUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLkdkPSEwO3ZhciBiPXRoaXMuTmYoKTtpZihifHx0aGlzLmlhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuU2I9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLlNiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5TYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuWSgpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHd4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5zZiYmYi5hZHMmJih0aGlzLnNmPWIuYWRzKTtyZXR1cm4gdGhpcy5zZn0sSW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMub2UoKX0uYmluZCh0aGlzKSl9LHZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5OZigpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmYoKX0uYmluZCh0aGlzKSw1MCl9LHNnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPApiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5RcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlVjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlVjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLmdiKCl9ZWxzZSB0aGlzLldmP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nYigpLGI9dGhpcy5VYygpO2EmJiFiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWSgpKToodGhpcy5ZKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxKbzpmdW5jdGlvbigpe3RoaXMuV2J8fCh0aGlzLldiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5XYiE9Yi5hZHMuc3RhdGUmJih0aGlzLldiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLldiKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuV2I9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpvKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITA7dGhpcy5vKCJlbXB0eSB2YXN0Iil9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLmJoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLmJoLGZ1bmN0aW9uKCl7dGhpcy52ZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxPbzpmdW5jdGlvbigpe3RoaXMuR3h8fCgxMDx0aGlzLmV3Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApKToodGhpcy5ldysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9vKCl9LmJpbmQodGhpcyksNTApKSl9LHV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5mdyl7dGhpcy5mdz0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy51bXx8RGE7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUGcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLlBnKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LFBnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTt2YXIgRWE9Yy53bXx8RWEsRmE9bmV3IEVhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl3PXRoaXMuYVs5XTt0aGlzLkN2PXRoaXMuYVs5XTt0aGlzLlhzPXRoaXMuYVs2XTt0aGlzLkh0PXRoaXMuYVs0XTt0aGlzLiR0PXRoaXMuYVs2XTt0aGlzLnhoPXRoaXMuYVs3XTt0aGlzLlh3PXRoaXMuYVs3XTt0aGlzLnNtPXRoaXMuYVszXTt0aGlzLlFtPQp0aGlzLmFbN107dGhpcy5xbT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs0XX1jLmpwPWI7Yi5wcm90b3R5cGU9e0h3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jdzp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3Y6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhzOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdDp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuJHQ6dGhpcy53aChhKX0sd2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhoOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ydzp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnFtOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgR2E9Yy5qcHx8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSHcoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksCmc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApOwpyZXR1cm4gYn0sVGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuUWx8fEhhOyhmdW5jdGlvbihjKXtjLlBsPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm9jPSExO3RoaXMuRGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5vYz0KITAsdGhpcy5vKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy5HYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLnBmKCk6dGhpcy5vKCl9LEdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm9jPSEwLHRoaXMubygpOwp0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMub2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5HYy5iaW5kKHRoaXMpLDEwMCl9fSxwZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSwKdGhpcy5vKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGYuYmluZCh0aGlzKSw1MCl9fSxEZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7CmIuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5vYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5QbHx8SWE7KGZ1bmN0aW9uKGMpe2MuUmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiYKdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuUmx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbMTBdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuRXA9dGhpcy5hWzldO3RoaXMuT2s9dGhpcy5hWzhdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuTHc9dGhpcy5hWzEwXTt0aGlzLm5oPXRoaXMuYVsyXTt0aGlzLnFwPXRoaXMuYVs2XTt0aGlzLlZuPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLkRsPWI7Yi5wcm90b3R5cGU9e1p3OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuJHc6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxzOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FcDp0aGlzLk5rKGEpfSxOazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2s6dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJpOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbjp0aGlzLkt3KGEpfSxLdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHc6dGhpcy5taChhKX0sbWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5oOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcDp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZuOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5EbHx8TGEsUmM9bmV3IExhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLlp3KDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMucmc9YX0sTjpmdW5jdGlvbigpe30saWU6ZnVuY3Rpb24oYil7dGhpcy5yZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5yZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5RaHx8TWE7KGZ1bmN0aW9uKGMpe2MuUGg9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0saWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLlBofHxOYTsoZnVuY3Rpb24oYyl7Yy5SaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuaWUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuaWUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5SaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuVms9dGhpcy5hWzEwXTt0aGlzLkhvPXRoaXMuYVs5XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLmppPXRoaXMuYVs4XTt0aGlzLkZ2PXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5zdD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs5XX1jLnl1PWI7Yi5wcm90b3R5cGU9e3dqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlVrKGEpfSxVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ibzp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSWo6dGhpcy5paShhKX0saWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmppOnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdjoKdGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFrOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54czp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3Q6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBRYT1jLnl1fHxRYSxTYz1uZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53aig0KTsoZnVuY3Rpb24oYyl7Yy50az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksCmE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLnRrfHxSYTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnZjKCl9LmJpbmQodGhpcykpLAokKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSkpOnRoaXMudmMoKX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuc2t8fFNhOyhmdW5jdGlvbihjKXtjLnVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj0KbmV3IFJhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgU2EoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRhPWMudWt8fFRhLFVhPW5ldyBUYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdz10aGlzLmFbNV07dGhpcy4kcT10aGlzLmFbMl07dGhpcy5VbT10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzRdO3RoaXMuRm89dGhpcy5hWzRdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOF19Yy5BbT1iO2IucHJvdG90eXBlPXtRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRxOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLkJqOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLkFtfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Rdyg0KTsoZnVuY3Rpb24oYyl7Yy5jbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLnJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYKKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxjdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5xZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMucmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLAoiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnJlKys7aWYoMTA8dGhpcy5yZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpOwp2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLmNsfHxXYTsoZnVuY3Rpb24oYyl7Yy5ibD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlJkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUmQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsCmEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLlhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJgohdGhpcy5lcT8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5lcT0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuY3UoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuYmx8fFhhOyhmdW5jdGlvbihjKXtjLmRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5kbHx8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVzPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVsxMF07dGhpcy5Hdz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs3XX1jLlpyPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLkhtKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd3OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyICRhPWMuWnJ8fCRhLFVjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLmRzKDQpOyhmdW5jdGlvbihjKXtjLmpqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5VKGIuZWxlbWVudCl9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sCnZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciBhYj1jLmpqfHxhYjsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgYmI9Yy5panx8YmI7KGZ1bmN0aW9uKGMpe2Mua2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLApmdW5jdGlvbihiKXtiPW5ldyBhYihiLmRldGFpbCk7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYmIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBjYj1jLmtqfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanU9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzFdO3RoaXMuVGo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzEwXTt0aGlzLmt0PXRoaXMuYVsyXTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qdTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5TaihhKX0sU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRqOgp0aGlzLktyKGEpfSxLcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHI6dGhpcy5qdChhKX0sanQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmt0OnRoaXMuc3AoYSl9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmw6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBlYj1jLkRyfHxlYixWYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy5pdSg0KTsoZnVuY3Rpb24oYyl7Yy5Eaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5MZihiLCJlbGVtZW50SUQiKTt0aGlzLnpnPWIucG9zaXRpb25pbmc7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuUGM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5QYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApObzpmdW5jdGlvbigpe2UuYWcodGhpcy5QYyk7ZS5iZyh0aGlzLlBjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTm8oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBmYj1jLkRqfHxmYjsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZ2I9Yy5Danx8Z2I7KGZ1bmN0aW9uKGMpe2MuRWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy54YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuTGYoYiwiZWxlbWVudElEIik7ZS5hZyhhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMudGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGhiPWMuRWp8fGhiLGliPW5ldyBoYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLll3PWI7Yi5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Lbjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuWXd8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLkpuKDQpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMucGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sSHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx2bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLnBqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuUGE9YTt0aGlzLkhmPXRoaXMubGg9ITE7dGhpcy50Zz1kO3RoaXMuUWc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuUGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8CjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLmJlKHRoaXMuUGEudXJsKSYmbS5yZCl7dmFyIGg9bmV3IHooYS51cmwpO2guSHUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLnFqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBhLmRhdGE7CmlmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5IZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUWc/dGhpcy52Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCExKTp0aGlzLnZiLm9wZW4odGhpcy5QYS5tZXRob2QsdGhpcy5QYS51cmwsITApLHRoaXMubGh8fCh0aGlzLnZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx0aGlzLnZiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5iZSh0aGlzLlBhLnVybCk/bS5yZD9tLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLmJlKHRoaXMuUGEudXJsKSwKdGhpcy50ZyYmdGhpcy50ZygpfXJldHVybiB0aGlzLnZifX19KShjKTt2YXIga2I9Yy5xanx8a2I7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuVWI9IiI7dGhpcy5IZD10aGlzLlRiPXRoaXMuZWI9bnVsbDt0aGlzLnhwPXRoaXMucWI9dGhpcy5pZz0hMTt0aGlzLnVhPSIiO3RoaXMuZGc9ITE7dGhpcy5CYT10aGlzLlhjPSIiO3RoaXMuJGY9dGhpcy5hYT10aGlzLmlzRW5hYmxlZD10aGlzLnhlPSExO3RoaXMuT2E9W107dGhpcy5UZj10aGlzLkliPSIiO3RoaXMuTmQ9ITE7dGhpcy5LZT0wO3RoaXMuWGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5WZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMucmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjsKdGhpcy5LYj0iIjt0aGlzLnJiPVtdO3RoaXMuTGI9W107dGhpcy5KYj0iIjt0aGlzLkxlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuWGQ9ITE7dGhpcy5Qbz10aGlzLnNkPW51bGw7dGhpcy5OZz10aGlzLnBjPXRoaXMuQWY9dGhpcy5OZT10aGlzLnJkPXRoaXMuSWQ9dGhpcy50Yz0hMTt0aGlzLlNhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLnJqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuVWIsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5UYixhZHRhZ3JlZ2V4OnRoaXMuSGQsanNwb3B1cHM6dGhpcy5pZyxzaWRlbG9hZHM6dGhpcy5xYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMudWEsaXNJbml0aWFsaXplZDp0aGlzLmRnLGdsb2JhbENvbmZpZzp0aGlzLlhjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCwKaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLiRmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkliLGhvbWFkQWRwYXRoOnRoaXMuVGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5OZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5LZSxIT01BRF9WRVJJRklFRDp0aGlzLlhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5WZSxIT01BRF9OT0JMT0NLRVI6dGhpcy53YixIT01BRF9BREJMT0NLRVI6dGhpcy5yYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuV2UsdGVzdEhpZGU6dGhpcy5LYix0ZXN0VGFnczp0aGlzLnJiLHRlc3RUYWdzSlM6dGhpcy5MYix0ZXN0Q29va2llOnRoaXMuSmIsdGhyb3R0bGU6dGhpcy5MZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLlhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuUG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy50YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuSWQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucmQsCnVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLk5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkhiLHNlcnZlcklkOnRoaXMuSWcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlliLHZwYWlkOnRoaXMucGMsc2tpcEFsbG93ZWQ6dGhpcy5OZ319LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJihhPSEwKTtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dGhpcy5TYVthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxwZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5wbyhhKX0sR2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixsPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLmFlKGEpO2U9dGhpcy5KYShhKTtjPyh0aGlzLmdjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsbD1lLnBhdGguc3Vic3RyKDEpKTooaD10aGlzLnplKCksbD1lLnBhdGguc3Vic3RyKDEpKyhlLnF1ZXJ5PyI/IitlLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuVWJ8fHRoaXMuZWJ8fAp0aGlzLlRifHx0aGlzLkhkKSYmKGw9dGhpcy5OcyhsKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnpxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1sO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGwpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmdjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTsKcmV0dXJuIGJ9LGdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxiZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLmFlKGEpO3JldHVybiBifSx6cTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudWEmJjA8dGhpcy51YS5sZW5ndGgpcmV0dXJuIHRoaXMudWE7Zm9yKGQgaW4gdGhpcy51YSlpZihiPXRoaXMudWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09CmEpcmV0dXJuIGIub3g7cmV0dXJuIm5vbmUifSxaYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMuSWddfSx6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWmMoKSxiPXRoaXMuTWcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb2c6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLkphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEQ9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksCmM9e30sbD0wO2w8RC5sZW5ndGg7bCsrKXt2YXIgdD1EW2xdLnNwbGl0KCI9Iik7Y1t0WzBdXT10WzFdfWZvcih2YXIgayBpbiBiW2hdLnN1YnZhbHVlcyljW2tdPXRoaXMub2coY1trXSxrLGJbaF0uc3VidmFsdWVzW2tdKTtEPVtdO2ZvcihrIGluIGMpRC5wdXNoKGsrIj0iK2Nba10pO2M9RD1lbmNvZGVVUklDb21wb25lbnQoRC5qb2luKCImIikpfWVsc2UgYz10aGlzLm9nKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9az1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWsucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sTnM6ZnVuY3Rpb24oYSl7dGhpcy5VYiYmKGErPXRoaXMuVWIpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3RoaXMuVGImJihhPXRoaXMuTXMoYSx0aGlzLlRiKSk7cmV0dXJuIGF9LApjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5kZz0hMDt0aGlzLlhjPWE7dGhpcy5CYT1iO3RoaXMueGU9ZDt0aGlzLnNkPWM7dGhpcy5OYz1lO3RoaXMuSGI9aHx8e307dGhpcy5ycygpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5CYSl0aGlzLnBzKCk7ZWxzZSB0cnl7dGhpcy5CYT1iKCksdGhpcy5JYygpfWNhdGNoKGwpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scnM6ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyB6KHRoaXMuWGMrdGhpcy56YygiZ2xvYmFsIikpLHRoaXMuTXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5JYygpfS5iaW5kKHRoaXMpLAohMCl9LHBzOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnpjKCJjbGllbnQiKSk7dGhpcy5JYShuZXcgeih0aGlzLkJhK3RoaXMuemMoImNsaWVudCIpKSx0aGlzLkljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx6YzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5uYigpO3RoaXMuSGImJnRoaXMuSGIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkhiJiZ0aGlzLkhiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSWQpe3RoaXMuSWQ9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07CnRoaXMuTmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OYz90aGlzLk5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmFhPXRoaXMuJGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVmUpKTt0aGlzLnViKCk7ZS5aYihrLlN0KTsoYj1lLlFmKHRoaXMuWmMoKSkpfHwoYj1lLlFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxNcTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5JYnx8dGhpcy51YXx8dGhpcy5JYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX19LEljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuT2E9YS5zZXJ2ZXJ8fFtdO3RoaXMuSWI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLlRmPWEuYWRwYXRofHwiIjt0aGlzLk5kPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuSWc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuT2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYiYmdGhpcy51YSYmdGhpcy5PYS5sZW5ndGg/dGhpcy5iZCghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSx0aGlzLnViKCkpfSxiZDpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy56ZSgpKSxjPXRoaXMuSmEodGhpcy5JYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkliK3RoaXMuemMoImN1c3RvbWVyIikpO3RoaXMuSWEoYix0aGlzLmF2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjdXN0b21lciIpO2E/dGhpcy5FbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLkVsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZCghMCl9LmJpbmQodGhpcyksCjEwMCkpOnRoaXMuYmQoITApfS5iaW5kKHRoaXMpLCEwKX19LGF2OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fXRoaXMucmQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy5OZT10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFmPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5ZYj10aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuS2I9Yi50ZXN0aGlkZXx8IiI7dGhpcy5yYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5VYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlRiPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5IZD1iLmFkdGFncmVnZXh8fApudWxsO3RoaXMuaWc9Yi5qc3BvcHVwc3x8ITE7dGhpcy5xYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5wYz1iLnZwYWlkfHwhMTt0aGlzLkhiLnZwYWlkPXRoaXMucGM7dGhpcy5OZz1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkVjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5KYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5OZCYmKHRoaXMuSmI9bnVsbCk7dGhpcy5MZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLlhkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5YZD0hMCx0aGlzLmJkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnN2KCkmJih0aGlzLktifHx0aGlzLkxifHx0aGlzLnJifHx0aGlzLkpiKT90aGlzLnhlPyh0aGlzLm9hPXRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSwKdGhpcy5KZCgpLHRoaXMudWIoKSk6dGhpcy5odigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLml2KCkpfX0saHY6ZnVuY3Rpb24oKXt0aGlzLmd2KCl9LGl2OmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKX0scWQ6ZnVuY3Rpb24oYSl7dGhpcy50Yz0hMDt0aGlzLmFhfHwodGhpcy5hYT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYShhKSksdGhpcy51YigpLHRoaXMuSmQoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5LYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLktiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5xZCh0aGlzLnJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VZygpfWVsc2UgdGhpcy5VZygpfSxUZzpmdW5jdGlvbigpe3ZhciBmO3ZhciBjO2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5uYigpKTt0aGlzLmx2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5IZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5yYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMucmI9bnVsbCx0aGlzLkhlKCl9LGx2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7ZSgpJiYKYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0sVWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoKSk7dGhpcy5tdihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLnFkKHRoaXMucmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuTGImJnRoaXMuTGIubGVuZ3RoKXt2YXIgYz10aGlzLkxiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVGcoKX0sbXY6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtoKCkmJmIoKX1mdW5jdGlvbiBlKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gbD8od2luZG93LmNsZWFyVGltZW91dChsKSwhMCk6ITF9dmFyIGw9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChtKXtmKCl9fSxIZTpmdW5jdGlvbigpe3RoaXMuSmI/KHRoaXMuS2UrKyx0aGlzLklhKG5ldyB6KHRoaXMuSmIpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuSWUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5SZygpfSxJZTpmdW5jdGlvbihhKXt0aGlzLnFkKHRoaXMuV2UsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuS2U/dGhpcy5IZSgpOnRoaXMuSWUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlJnKCk6dGhpcy5JZSgiQUFBIil9LFJnOmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKTt0aGlzLkpkKCl9LHViOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMudGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlhlKSk7CnRoaXMuc2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5zZCYmdGhpcy5zZCgpfSxNbzpmdW5jdGlvbigpe2lmKHRoaXMuTmUmJnRoaXMuVnEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sV2c6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsYyxmLGgsRCl7YT1uZXcga2IoYSxiLGMpO2YmJihhLmxoPSEwKTtoJiZlLlRyKCkmJihhLkhmPSEwKTtEJiYoYS5RZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxuZjpmdW5jdGlvbigpe2UuWWEoKXx8ZS5NYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmdjKCl8fChhPXRoaXMuSmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKaC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5oYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sTG86ZnVuY3Rpb24oKXt0aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5JYShhLHRoaXMuJHYuYmluZCh0aGlzKSx0aGlzLlp2LmJpbmQodGhpcykpfSwkdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuY3EoKX0sWnY6ZnVuY3Rpb24oKXt9LGNxOmZ1bmN0aW9uKCl7ZS5aYihrLmJxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxKZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnFiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMucWIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMucWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuTWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLmZjKCldPXRoaXM7ZS5NYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxzdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLkxlfSxIcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxsLGssbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsbD0oZiYxNSk8PDJ8ZT4+NixrPWUmNjMsaXNOYU4oZik/bD1rPTY0OmlzTmFOKGUpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHUseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTQwOzU5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfG4md3xwJncpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBsYj1jLnJqfHxsYixtPW5ldyBsYjt3aW5kb3cudHg9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vdT10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbN107CnRoaXMuRW49dGhpcy5hWzZdO3RoaXMuUXE9dGhpcy5hWzJdO3RoaXMueWs9dGhpcy5hWzVdO3RoaXMudWk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbN119Yy5GaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub3U6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fbjp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUXE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlrOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIG1iPWMuRml8fG1iLFhjPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5udSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmY9YTthLnUuTD90aGlzLk5hPWEudS5MKCk6dGhpcy5OYT0iIjt0aGlzLmNvbnRhaW5lcj10aGlzLmYuVGE7dGhpcy5wbGF5ZXI9dGhpcy5mLnU7dGhpcy5BYj10aGlzLkNjPSExO3RoaXMubm89MUUzO3RoaXMuZGE9bnVsbDt0aGlzLlA9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5vZD17fTt0aGlzLkFjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuQWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5mLnUpJiZ0aGlzLmYudS5CJiYoYT10aGlzLmYudS5CKCkpLHRoaXMuQWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7CnRoaXMubmQ9ITE7dGhpcy5sZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5tPXt9O3RoaXMueWM9ITE7dGhpcy5aZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkRiPSExO3RoaXMuaXA9ZS5wYSgxMCk7dGhpcy5kZD1lLnBhKDEwKTt0aGlzLm1lPWUucGEoMTApO3RoaXMuT2c9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWGI9dGhpcy5rYj0hMTt0aGlzLlFkPW51bGw7dGhpcy5aZD10aGlzLnVlPXRoaXMuS2Q9dGhpcy5NYz10aGlzLkdlPXRoaXMudmc9dGhpcy5RYz10aGlzLnl2PXRoaXMuYWI9ITF9Yy5saj1iO2IucHJvdG90eXBlPXtKZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxYZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuSGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuUC50Yz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQoay5tbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpfSxnZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuUC5hYSl0aGlzLlAuTW8oKSx0aGlzLlAub2EmJnRoaXMuUC5pc0VuYWJsZWQ/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5QLnBjfSkpOmI/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUC5wYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQ2EoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZ2UoYSwKYixjKX0sNTApfX0sc2U6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMTt0aGlzLm09YTt0aGlzLlB1KHRoaXMubSk7dGhpcy5SZihhKX0sUmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMub2Q9dGhpcy5KcShhKSksdGhpcy5SZihhLnBhcmVudCkpfSxKcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWil7Yj1hLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5aLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmCihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZ2E6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLk9jJiZhLk9jLmVycm9yJiZhLk9jLmVycm9yLmNvZGUmJihiPWEuT2MuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5xYy5jb2RlOmI9PUUueGQuY29kZT9lLkQoay50dyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpOihlLmhlKCksYj09RS4kZS5jb2RlJiZlLkQoay5Ucyx0aGlzLm0uUix0aGlzLmYudS5CKCksCnRoaXMuVCgpKSk7ZS5EKGsuYXEsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB4LlllLmNvZGU6ZS5EKGsuYXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LmFmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGsuQXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC55ZC5jb2RlOmUuRChrLkp3LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC53ZC5jb2RlOmUuRChrLlVzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLAp0aGlzLlhifHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLmxhJiYoYys9Il8iK2EuZXJyb3IubGEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5CYihhKTt0aGlzLkNhKCl9LEJiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5BYS5sZW5ndGg7KXRyeXt2YXIgYz1hLkFhLnBvcCgpO3RoaXMuZmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LFB1OmZ1bmN0aW9uKGEpe3RoaXMuS2Q9dGhpcy5aZD10aGlzLnVlPSExO3RoaXMucmE9dGhpcy5mLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmYuQzsKYi5NeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuQW4mJnRoaXMucGxheWVyLlRjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5UYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuTS5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5NW2NdLnR5cGUpJiZ0aGlzLnduKGIsYS5NW2NdLnVybCsiIixhLk1bY10udHlwZSk7dGhpcy5WZyhiKT8odGhpcy55bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmRhPQp0aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5tLmNwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5OdSgpKTp0aGlzLiRkKCk/dGhpcy5MZygpOnRoaXMubS5vcmlnaW4uQmYoeC53ZCl9LE51OmZ1bmN0aW9uKCl7ZS5yZigpO3RoaXMubSYmdGhpcy5tLm9yaWdpbiYmdGhpcy5tLm9yaWdpbi5TZSYmZS56bih0aGlzLm0ub3JpZ2luLlNlKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5mLkM7dGhpcy5mLkM9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuZi5DLGEpO3RoaXMuZi53ZygpOwp0aGlzLmYubGMoKTtmb3IoYT10aGlzLmYuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5mLmxjKCk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5mLkcuYXBwZW5kQ2hpbGQodGhpcy5PKTt0aGlzLk8ub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLkxxKCksYj10aGlzLm0uUi5PcmlnaW5hbEFkUGFyYW1ldGVycywKYz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDphLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTphLmRlc2lyZWRCaXRyYXRlfHxhLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpifSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuZi5HLnN0eWxlLmhlaWdodCl9fX07ZS56YSh0aGlzLk8sImNvbmZpZyIsYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnlvKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuUCk7dGhpcy5PLnNyYz1hO2UuRWQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt3KGEpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMubHcoKSx0aGlzLmYuY2MoITApKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmYuY2MoITApLHRoaXMubncoKSksIkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmNjKCEwKSx0aGlzLnJ3KCkpLCJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB3KCksIkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF3KCksIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coKSwiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3coKSwiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaWgoKSl9LmJpbmQodGhpcykpOwplLkVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcykpO2UuRWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmYudG4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxudzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpfSxsdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIil9LHJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlFhKCJzdGFydCIpfSxwdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtlLlFhKCJmaXJzdFF1YXJ0aWxlIil9LHF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpfSxzdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlFhKCJ0aGlyZFF1YXJ0aWxlIil9LApvdzpmdW5jdGlvbigpe3RoaXMudGQoKTtlLlFhKCJjb21wbGV0ZSIpfSxpaDpmdW5jdGlvbihhKXtpZih0aGlzLk8mJnRoaXMuTy5wYXJlbnROb2RlJiZ0aGlzLk8ucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLlFhKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLk8ucGFyZW50Tm9kZTt0aGlzLk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLk8pO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTt0aGlzLk89ZS5iYT0hMTt0aGlzLkNhKGEpfX0sa3c6ZnVuY3Rpb24oYSl7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLm1lc3NhZ2UsITApO2UuUWEoImVyciIsYS5tZXNzYWdlKTt0aGlzLmloKCEwKX0sd246ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5QO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5nYygpPyhmPWUuSmEoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsCiJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuY3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LHluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhoLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuUGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGg6ZnVuY3Rpb24oYSl7dGhpcy5BYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFifHx0aGlzLlBlKGEpfS5iaW5kKHRoaXMpLHRoaXMubm8pKX0sUGU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuQ2MmJnRoaXMuVmcodGhpcy52aWRlbykmJiF0aGlzLmtiJiYhdGhpcy5BYil7dGhpcy5DYz0hMDt0cnl7aWYoIWUuWWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMubS5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMua2J8fCh0aGlzLmtiPSEwLHRoaXMuaGQodGhpcy52aWRlbyksCmUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuUC5BZnx8dGhpcy5QLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuQ2EoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwiIiwhMCl9dGhpcy5idygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5mLmxjKCk7dGhpcy5laCgpO3RoaXMuZmgoKTt0aGlzLmxmKCk7dGhpcy5mLndnKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZlKCl9fSxGZTpmdW5jdGlvbigpe2lmKCF0aGlzLk1jKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuSGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuWWM9W107Zm9yKHZhciBiPXRoaXMuZi5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlljLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PQoibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMueGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsCmIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhjKCl9ZWxzZSB0aGlzLnhjKCl9LHhjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuWWMpZm9yKHZhciBiPTA7Yjx0aGlzLlljLmxlbmd0aDtiKyspdGhpcy5ZY1tiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5NY3x8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuQ2EoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLnBnKCEwKSx0aGlzLnhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLlpkJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy51ZT0hMH0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5GYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkZiLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LmJpbmQodGhpcyk7dGhpcy5UZCgpLktnKHRoaXMpfSx0ZDpmdW5jdGlvbigpe3RoaXMuUC5ZYiYmIXRoaXMua2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChrLmduLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5DYSgpfSxDYTpmdW5jdGlvbihhKXtpZighdGhpcy5LZClpZih0aGlzLktkPSEwLHRoaXMubS4kYXx8dGhpcy5tLlBiKXt0aGlzLkFiPXRoaXMuQ2M9ITE7dHJ5e3RoaXMuaGQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5uZD0hMTt0cnl7dGhpcy5mLmFoKCl9Y2F0Y2goZSl7fXRoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5EYj0hMTt0aGlzLlRkKCkuRWcoKTt0aGlzLm0uJGEmJnRoaXMubS5vcmlnaW4ubmUoKTt0aGlzLm0uUGImJihhP3RoaXMubS5vcmlnaW4ucWcoKTp0aGlzLkxkKCkpfWVsc2UgdGhpcy5MZCgpfSxjdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuJGQoKT90aGlzLkxnKCk6dGhpcy51ZChhKSl9LHVkOmZ1bmN0aW9uKGEpe3RoaXMuQWI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLiRkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHx0aGlzLlAubmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUC5uZigpKTt0aGlzLm0ub3JpZ2luLkJmKHgud2QpfSxRZTpmdW5jdGlvbigpe2lmKHRoaXMueXYpdGhpcy5DYSgpO2Vsc2V7dGhpcy5EYj0hMDt0aGlzLmYudS5sYiYmIXRoaXMuR2UmJnRoaXMuZi51LmxiKCkmJmUuRChrLktjLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLkR2KGEpO3ZhciBiPSIiO2lmKHRoaXMubS5FZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PZyk7YyYmKGI9dGhpcy5tLkVlLWEsMDxiP2I9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYik6KGI9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKSx0aGlzLm5kfHwodGhpcy5uZD0hMCxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGsubm4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLm0uJGE/KHRoaXMuQWI9dGhpcy5DYz0hMSx0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMubmQ9ITEsdGhpcy5mLmFoKCksdGhpcy5tLm9yaWdpbi5uZSgpKTp0aGlzLkNhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9Yil9dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsZS5JZih0aGlzLm0uZHVyYXRpb24tYSkpKTt0aGlzLnljPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxMZzpmdW5jdGlvbigpe3RoaXMuWGI9ITA7dGhpcy5yYT10aGlzLmYuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuRXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5mLkM9YTt2YXIgYj10aGlzLmYuQyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5mLmxjKCk7dGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyk7dGhpcy5kYS5hcHBlbmRDaGlsZChiKTt0aGlzLmVoKCk7dGhpcy5maCgpO3RoaXMuUWQ9c2V0SW50ZXJ2YWwodGhpcy5Lby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMubS5NLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5tLk1bY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUDtoLm9hJiZoLmlzRW5hYmxlZCYmIWguZ2MoKSYmKGU9aC5KYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LEtvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLm0uZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5RZCksdGhpcy50ZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLlFlKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLlFkKSwKdGhpcy51ZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFlnOmZ1bmN0aW9uKCl7dGhpcy52Z3x8KHRoaXMudmc9ITAsdGhpcy5RY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LER2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuWmd8fHRoaXMua2J8fCgwPT1hJiYodGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSksdGhpcy51ZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5aZD0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5ZZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuWWcoKX0uYmluZCh0aGlzKSksCnRoaXMuWGImJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLmtifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS5EKGsuam4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLkQoay5wbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWGImJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5ZYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuUWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQoay5obix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxhPT0KTWF0aC5mbG9vcih0aGlzLm0uZHVyYXRpb24vMikmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUuRChrLmxuLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLm0uZHVyYXRpb24vNCkmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLkQoay5ybix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxlLkQoay5zbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWmc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMua2Ipe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9CnRoaXMuS3EodGhpcy5tLkFhLGEpO2MubGVuZ3RoOyl0cnl7dmFyIGY9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMub2QuaW1wcmVzc2lvbnMmJmUuUnIoZi51cmwsdGhpcy5vZC5pbXByZXNzaW9ucyk/dGhpcy5mZShmLnVybCxmLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5EKGsua24sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpLHthZElkOnRoaXMub2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9KX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmZlKGYudXJsLGYudHlwZSl9Y2F0Y2goaCl7fWJ8fCh0aGlzLm0uQWE9dGhpcy5ycCh0aGlzLm0uQWEsYSkpfX0sZmU6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5QLkdhKGEpLGMmJmEudm4oYyksZnx8KGY9dGhpcy56ZiksdGhpcy5QLklhKGEsZix0aGlzLnpmLCExLCEwKSl9LEtxOmZ1bmN0aW9uKGEsCmIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHJwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyl9LGdoOmZ1bmN0aW9uKCl7ZS5EKGsuWm8sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7IXRoaXMuUWMmJmUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuc3EoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5tLkhjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMubS5IYywKdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIil9fSxlaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsCmUuSWYoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuUC5FYyYmKGI9dGhpcy5QLkVjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sYWM6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sa2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGZoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5pcDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPQoicmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLmRkO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF2LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2MuaWQ9dGhpcy5tZTtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnp2LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTsKZi5pZD10aGlzLk9nO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLm0uRWUmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz0KdGhpcy5kYS5hcHBlbmRDaGlsZChhKTt0aGlzLmYudS52YSYmdGhpcy5mLnUudmEoKSYmdGhpcy5wZygpO3RoaXMuYmMoKX19LGJjOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbGQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sQXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTt0aGlzLmYuQy5wYXVzZWQ/KHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSk6KHRoaXMuZi5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQoay5mZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTsKdGhpcy5mLkMucGF1c2VkfHwodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmZmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSx3dTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZCYmKHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LHp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tZSk7dGhpcy5mLkMubXV0ZWQ/KHRoaXMuZi5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOgoodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxwZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWUpO3RoaXMuZi5DLm11dGVkfHwodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxGYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5GYik7dGhpcy5NY3x8dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LApMZDpmdW5jdGlvbigpe3RoaXMuTWM9ITA7dGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5IYSYmdGhpcy55Y3x8InBvc3Ryb2xsIj09ZS5IYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuZi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmYubGMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpOwpiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTWQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5NZCgpfWVsc2UgdGhpcy5NZCgpfSxNZDpmdW5jdGlvbigpe3RoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5mLnh1KCk7dGhpcy5EYj0hMTtlLkQoay5ocCx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMuVGQoKS5FZygpfSxUZDpmdW5jdGlvbigpe3ZhciBhPQpudWxsO3RoaXMuZiYmdGhpcy5mLnUmJihhPXRoaXMuZi51KTtyZXR1cm4gYX0sJGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxsZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLmJnKHRoaXMudmlkZW8sYSk/dGhpcy53dSgpOnRoaXMucWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGYoKX0uYmluZCh0aGlzKSwxMDApKX0sVDpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMubSYmKGEuY2xpY2t0aHJvdWdoPXRoaXMubS5IYywKYS5kdXJhdGlvbj10aGlzLm0uZHVyYXRpb24sYS5hZFBvZD10aGlzLm0uJGEsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSx6ZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5sanx8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbT10aGlzLmFbNl07dGhpcy5Mdj10aGlzLmFbM107dGhpcy5hcD10aGlzLmFbN107dGhpcy5VdD10aGlzLmFbM107dGhpcy5tcT10aGlzLmFbM107dGhpcy5LaD10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLmJwPWI7Yi5wcm90b3R5cGU9e2RtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbTp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHY6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5hcDp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVXQ6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1xOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2g6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLmJwfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5kbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkxhPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUWI9dGhpcy5SYj0hMTt0aGlzLlNlPSIiO3RoaXMuUmU9ITE7ZCYmZC5lbXB0eT90aGlzLnVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLnRtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLndmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS50Zih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5wZChhKSkrIiZ0eXBlPWpzIiwKYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy50cy5iaW5kKHRoaXMpLHRoaXMucXMuYmluZCh0aGlzKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09CmUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5MYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYKInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6LTF9KTtyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3RoaXMubXUoYSk7dHJ5e3RoaXMuTGE9YS5yZXNwb25zZVhNTCx0aGlzLkxhfHwodGhpcy5MYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5KZigpO3RoaXMuUmI9dGhpcy5KZSgpO3RoaXMuUWI9dGhpcy5TZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnFjLHtlcnJvcjp0aGlzLlJlP0UueGQ6RS5aZX0pKX0sdXM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTGF8fCh0aGlzLkxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPXRoaXMuSmYoKTt0aGlzLlJiPXRoaXMuSmUoKTt0aGlzLlFiPXRoaXMuU2coKTt0aGlzLlcubGVuZ3RoP3RoaXMuaWMoKTp0aGlzLmdhKHRoaXMuRGEoeC5xYywKe2Vycm9yOnRoaXMuUmU/RS54ZDpFLlplfSkpfSxxczpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlllLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLldyKCk/dGhpcy5udigpPyhhKyssbmV3IGIodGhpcyx0aGlzLlNmKCksZyx7QWRTeXN0ZW06dGhpcy5xcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5hZikpOihhPTAsdGhpcy5YdigpJiZ0aGlzLnNlKHRoaXMua3AoKSkpfSxuZTpmdW5jdGlvbigpe3RoaXMuUmI/KHRoaXMuUmI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQubmUoKX0scWc6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLlFiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLmljKCkpOnRoaXMucGFyZW50LnFnKCl9LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3YoKT90aGlzLmp2KCk/ITA6KC0xIT10aGlzLiRiKCk/CnRoaXMuZ2EodGhpcy5EYSh4LlVlKSk6dGhpcy5nYSh0aGlzLkRhKHguaGkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnFjLEUuJGUpKSwhMSl9LHNlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5qZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlJiO2EuUGI9YS5QYj9hLlBiOnRoaXMuUWI7dGhpcy5wYXJlbnQuc2UoYSl9LGtwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy4kYigpO2EuTT10aGlzLk9mKCk7YS5IYz10aGlzLnRxKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5wcSgpO2EuRWU9dGhpcy5JcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguVWUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLnZxKCkpOmIuQWEuY29uY2F0KHRoaXMuQ3EoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5CYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LkJiJiYKdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0sQmY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxrdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2YoKS5sZW5ndGh9LGp2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy4kYigpfSxKZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuSmUoKSYmKGE9ITApO3JldHVybiBhfSxtdTpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuU2U9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLlJlPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFdyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5TZigpLmxlbmd0aH0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxxcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNkKHRoaXMuWiwiQWRTeXN0ZW0iKX0samU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwiRXJyb3IiXSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0KYS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx0cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxPZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLApEYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iikscng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSxwcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7CmEmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5XYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sJGI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LElxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLApkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxVZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5XYyhhKToiIn0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBVPWMudG18fFU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmtxPXRoaXMuYVs3XTt0aGlzLkNwPXRoaXMuYVs5XTt0aGlzLk1wPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HbDp0aGlzLmpxKGEpfSxqcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3E6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkNwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW46dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5odXx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkZsKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMuSGM9IiI7dGhpcy5SPXRoaXMuUGI9dGhpcy4kYT0hMTt0aGlzLm9yaWdpbj1udWxsfWMubWw9YjtiLnByb3RvdHlwZT17Y3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9CnRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBvYj1jLm1sfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMTBdO3RoaXMuVG49dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzNdO3RoaXMuZXY9dGhpcy5hWzZdO3RoaXMuams9dGhpcy5hWzVdO3RoaXMuaGo9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbNl19Yy5xbz0KYjtiLnByb3RvdHlwZT17enI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFyOnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ubjp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWk6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Mczp0aGlzLmR2KGEpfSxkdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXY6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmprOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5oajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMucW98fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLnpyKDQpOwp2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGhpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxxYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxhZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFllOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCmd4Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxVZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17WmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sJGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0saXg6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRnQ9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzhdO3RoaXMudmg9dGhpcy5hWzZdO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbN119Yy5ndD1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnQ6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZbTp0aGlzLnVoKGEpfSx1aDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmg6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlB0OnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXQ6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBzYj1jLmd0fHxzYixhZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQuRXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5PYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLlJpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5SaXx8cGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMuWGo9dGhpcy5hWzFdO3RoaXMuR3I9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuQXA9dGhpcy5hWzhdO3RoaXMueXc9dGhpcy5hWzNdO3RoaXMuZHg9dGhpcy5hWzddO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLlJvPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsyXX1jLkNpPWI7Yi5wcm90b3R5cGU9CntDaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGg6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3I6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNqOnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lajp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnl3OnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5keDp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaGw6dGhpcy5RbyhhKX0sUW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sbzp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciB0Yj1jLkNpfHx0YixiZD1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5DaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlRhPWEuS2YoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuZmc9ITE7dGhpcy5kYz1bXX1jLnNpPWI7Yi5wcm90b3R5cGU9e0dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCwKZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdxKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5QcihhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sJHU6ZnVuY3Rpb24oKXt0aGlzLmZnPSEwfSxhaDpmdW5jdGlvbigpe3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sd2c6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQoay5LYyx0aGlzLnUuQigpKX0seHU6ZnVuY3Rpb24oKXt0aGlzLmZnfHwodGhpcy51LnBsYXkoKSxlLkQoay5MYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYKKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5UYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlRhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuVGEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5HYiYmdGhpcy51LkdiKCk/dGhpcy51LktmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2MuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LFByOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGNjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudXEodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHwKYi5wb3NpdGlvbiE9dGhpcy5VYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5VYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuVWEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuVWEud2lkdGgmJjA8dGhpcy5VYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLldkKCk7cmV0dXJufXRoaXMuVWE9Yjt0aGlzLnUuR2IoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5jYy5iaW5kKHRoaXMpLDEwKX0sdG46ZnVuY3Rpb24oYSl7dGhpcy5kY3x8KHRoaXMuZGM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmRjLnB1c2goYSl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zaXx8TyxDPVtdLHViPTA7MTAwPnViO3ViKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixCKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdD10aGlzLmFbN107dGhpcy5Haz10aGlzLmFbNF07dGhpcy53dj10aGlzLmFbMl07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbNV19Yy56dD1iO2IucHJvdG90eXBlPXtDdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRHQ6dGhpcy5GayhhKX0sRms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdrOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Y6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkttOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6CnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgdmI9Yy56dHx8dmIsY2Q9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2QuQ3QoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuUyhhKTt0aGlzLkRlKGIpO3RoaXMueGYoKX0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5FYSgpLGE9dGhpcy52aWRlb1RhZzthfHwKKChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlUoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhmKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LCRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkVhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgd2I9Yy5aa3x8d2I7KGZ1bmN0aW9uKGMpe2MuWWs9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy55Yj10aGlzLnlifHwhMTt0aGlzLmVmPXRoaXMuaGY9dGhpcy5YZj10aGlzLmphPXRoaXMuTWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5mcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELAoiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk1lPSEwO3RoaXMuWGYmJnRoaXMucWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLkRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLlhmPSEwO3RoaXMucWYoKX0uYmluZCh0aGlzKSk7dGhpcy5tZigpfSxxZjpmdW5jdGlvbigpe2lmKCF0aGlzLnliKXt0aGlzLkZjKCk7aWYoIXRoaXMuTWUmJiF0aGlzLkZjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5NZSYmdGhpcy5lZiYmIXRoaXMuaGYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLAoxMDApfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LFBmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LG1mOmZ1bmN0aW9uKCl7aWYodGhpcy5GYygpKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuaGY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5lZj1iLm54fXRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1mKCl9LmJpbmQodGhpcyksMTAwKX0sdXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh4KCk6ITF9LCRiOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi4kYigpOi0xfSxEcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxmcTpmdW5jdGlvbihiLGEpe3RoaXMueWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy55Ynx8MzAyPT10aGlzLnliP3RoaXMuamE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnliKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfSxKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT8odGhpcy5vKCksdGhpcy5uYSgpKTpiLiRjKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLkRxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHhiPWMuWWt8fHhiOyhmdW5jdGlvbihjKXtjLiRrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sVXI6ZnVuY3Rpb24oKXt3aW5kb3cuT08ucWwuYW4uWm0/d2luZG93Lk9PLnFsLmFuLlptLmx4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVyKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLnhhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRmEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyB3YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgeGIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHliPWMuJGt8fHliLHpiPW5ldyB5YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbNV07dGhpcy5YbD10aGlzLmFbNF07dGhpcy5ieD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs4XX1jLllxPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhsOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ieDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6CnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NaDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuWXF8fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlhyKDQpOyhmdW5jdGlvbihjKXtjLk5sPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEdiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5ObHx8VjsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LkRkKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS5EZCgiIyIrYiwiYWRzTWFuYWdlckxvYWRGYWlsIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksCjFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5kdChhKX0uYmluZCh0aGlzKSk7eS5VcSgpfSxkdDpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufX10aGlzLmwoImFkZXJyb3IiLGEpO3RoaXMudygpfX0pfSkoYyk7dmFyIFc9Yy5NbHx8VzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUud3AoYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuSChkKSl7dGhpcy5KKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5BKTtmLmIoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxoPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5jZHx8Cih0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxvdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLmhjfHwodGhpcy5oYz1bXSksdGhpcy5oYy5wdXNoKGIpLHRoaXMudnUoKSYmKHRoaXMuRmcoKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LFVxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkub3YoYil9fSl9KShjKTt2YXIgQmI9Yy5PbHx8QmIseT1uZXcgQmIocSk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHQ9dGhpcy5hWzFdO3RoaXMuYW09dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzNdO3RoaXMuZnQ9dGhpcy5hWzJdO3RoaXMuZm89dGhpcy5hWzddO3RoaXMuR209dGhpcy5hWzVdO3RoaXMueGw9dGhpcy5hWzNdO3RoaXMuemw9dGhpcy5hWzRdO3RoaXMuYnI9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbNV19Yy5wdj1iO2IucHJvdG90eXBlPXtLdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTHQ6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XbTp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnQ6dGhpcy5lbyhhKX0sZW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mbzp0aGlzLkZtKGEpfSxGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206CnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bDp0aGlzLnlsKGEpfSx5bDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuemw6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJyOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5wdnx8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuV2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLldofHxEYjsoZnVuY3Rpb24oYyl7Yy5YaD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuYXV8fCh0aGlzLmF1PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlhofHwKRWI7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRmI9Yy5ZaHx8RmIsR2I9bmV3IEZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNpPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsyXTt0aGlzLnFyPXRoaXMuYVs5XTt0aGlzLkZzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzZdfWMuTG49YjtiLnByb3RvdHlwZT17Ymk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNpOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucXI6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5Mbnx8SGIsZmQ9bmV3IEhiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLmJpKDQpOyhmdW5jdGlvbihjKXtjLnltPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMueW18fEliOyhmdW5jdGlvbihjKXtjLnhtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMua2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLm9xfHwodGhpcy5ZZigpLAp0aGlzLm9xPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm8oKTp0aGlzLmtmPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMucygpKToodGhpcy5rZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sWWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnJxKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZZigpfS5iaW5kKHRoaXMpLDUwKX0sRng6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueG18fEpiOyhmdW5jdGlvbihjKXtjLnptPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEtiPWMuem18fEtiLExiPW5ldyBLYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Faz10aGlzLmFbOV07dGhpcy5Sdj10aGlzLmFbMTBdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMudXY9dGhpcy5hWzVdO3RoaXMub3Q9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbNl19Yy5Xbz1iO2IucHJvdG90eXBlPXtEazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWs6dGhpcy5RdihhKX0sUXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sdjp0aGlzLmttKGEpfSxrbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG06dGhpcy50dihhKX0sdHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnV2OnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciBNYj1jLldvfHxNYixnZD1uZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1nZC5Eayg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpOwpiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgTmI9Yy5aanx8TmI7KGZ1bmN0aW9uKGMpe2MuWWo9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuamgoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLkdmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLApmdW5jdGlvbigpe3RoaXMuR2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMucW4oKX0uYmluZCh0aGlzKSksdGhpcy5raD0hMSx0aGlzLnd3PTFFMyx0aGlzLnlnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxHZjpmdW5jdGlvbigpe3RoaXMueWcuZG9uZXx8KHRoaXMueWcuZG9uZT0hMCx0aGlzLmtoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qaCgpfS5iaW5kKHRoaXMpLHRoaXMud3cpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2gpO3RoaXMubygpfSxqaDpmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sTWY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHdhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5NZihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLk1mKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLllqfHxPYjsoZnVuY3Rpb24oYyl7Yy4kaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmCndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBQYj1jLiRqfHxQYixRYj1uZXcgUGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLkhzPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVs4XTt0aGlzLlZ1PXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzRdfWMuJHA9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZHI6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZ1OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgUmI9Yy4kcHx8UmIsaGQ9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLlR3KDQpOyhmdW5jdGlvbihjKXtjLklsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBTYj1jLklsfHxTYjsoZnVuY3Rpb24oYyl7Yy5IbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLAphKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpO3RoaXMuVmIoKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5jZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwKMTApfSxjZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgVGI9Yy5IbHx8VGI7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJgohd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLkpsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzRdO3RoaXMudnc9dGhpcy5hWzEwXTt0aGlzLkNrPXRoaXMuYVs0XTt0aGlzLlFrPXRoaXMuYVs2XTt0aGlzLlZoPXRoaXMuYVsyXTt0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLlhuPXRoaXMuYVsyXTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzVdfWMuZmo9YjtiLnByb3RvdHlwZT17VW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQ246dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZ3OnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dazp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWs6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZoOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5XbihhKX0sV246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhuOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMuZmp8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PQppZC5Vbyg0KTsoZnVuY3Rpb24oYyl7Yy5CbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuUyhiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy50ZT0hMX0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZHUoKX0uYmluZCh0aGlzKSw1MDApfSxkdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7CnJldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy50ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50ZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFh1OmZ1bmN0aW9uKCl7dGhpcy50ZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBYYj1jLkJsfHxYYjsoZnVuY3Rpb24oYyl7Yy5BbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuTmI9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk5ifHwodGhpcy5OYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsCiJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk5ifHx0aGlzLk5iKyssdGhpcy5OYjw9dGhpcy5Kcz8odGhpcy5OYisrLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSl9LHM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlh1KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBZYj1jLkFsfHxZYjsoZnVuY3Rpb24oYyl7Yy5DbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSwKdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWWIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBaYj1jLkNsfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUWk9dGhpcy5hWzNdO3RoaXMuQmg9dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVs5XTt0aGlzLlBuPXRoaXMuYVszXTt0aGlzLnVyPXRoaXMuYVs0XTt0aGlzLlpsPXRoaXMuYVsxXTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVs0XX1jLm9tPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RaTp0aGlzLkFoKGEpfSxBaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQmg6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRoOnRoaXMuUXUoYSl9LApRdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnU6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBuOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51cjp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWmw6dGhpcy5IcChhKX0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLklwOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIGFjPWMub218fGFjLGpkPW5ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLlBpKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT0KdGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBiYz1jLnNsfHxiYzsoZnVuY3Rpb24oYyl7Yy5ybD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBiKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuZXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuVmMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm1zKCk6dGhpcy5WYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZigpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5kZigpfHx0aGlzLnMoITApfSxtczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmMoKTshYi5tYSYmYi5XJiZiLmt4JiZiLm14JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlZjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwxMDApfSxWYzpmdW5jdGlvbigpe2lmKCF0aGlzLnVnKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy51Zz1iW2NdKTtyZXR1cm4gdGhpcy51Z30sY2U6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuVmMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKToKdGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNjPWMucmx8fGNjOyhmdW5jdGlvbihjKXtjLnRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGJjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBjYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBkYz1jLnRsfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmNtPXRoaXMuYVsxMF07dGhpcy51bz10aGlzLmFbOV07dGhpcy5CdD10aGlzLmFbN107dGhpcy5jbz10aGlzLmFbNV07dGhpcy5Haj10aGlzLmFbMTBdO3RoaXMucmg9dGhpcy5hWzVdO3RoaXMuY3M9dGhpcy5hWzFdO3RoaXMuaXE9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbMl19Yy5Fcj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY206dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVvOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CdDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucmg6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNzOnRoaXMuaHEoYSl9LApocTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaXE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLkVyfHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5ibSg0KTsoZnVuY3Rpb24oYyl7Yy5xaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hPwp0aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7CmIhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5xa3x8WDsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy52ZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnZlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMudmUmJmIhPXRoaXMudmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5KeCksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLnBrfHxZOyhmdW5jdGlvbihjKXtjLnJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFkoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5GZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLnJrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuS3UoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUua2cuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlsW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLmtnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVHA9dGhpcy5hWzZdO3RoaXMuT209dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzZdO3RoaXMuaT10aGlzLmFbOF19Yy5haj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5ObShhKX0sTm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5PbTp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYz1jLmFqfHxpYyxsZD1uZXcgaWMoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bGQuU3AoNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlMoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5Tcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX0sCkN1OmZ1bmN0aW9uKGIpe3RoaXMuQmQ9Yn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Tc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkJkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5CZCYmKG5ldyBJKHRoaXMsdGhpcy5CZCkpLmIoKSl9fSl9KShjKTt2YXIgTj1jLmdtfHxOOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5SZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuTXUoKTp0aGlzLnMoITApLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlJkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSwKWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuZm18fEk7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuQ3UodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuaG18fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51dD0KdGhpcy5hWzVdO3RoaXMuYXQ9dGhpcy5hWzVdO3RoaXMuenM9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbOV19Yy5Saz1iO2IucHJvdG90eXBlPXt0dDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF0OnRoaXMueXMoYSl9LHlzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56czp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYz1jLlJrfHxsYyxtZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC50dCg0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy51Zj0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmVhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51Zn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3pvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMudWY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCnt6bzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIG1jPWMubmt8fG1jOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE54OmZ1bmN0aW9uKCl7fSxxdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLlRlKG5ldyBmdW5jdGlvbigpe30pO2EuaHg9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IucXUoYSk7d2luZG93LnB4PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLnB1fHwodGhpcy5wdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLllkfHwodGhpcy5ZZD0xKTtpZigyMDx0aGlzLllkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkthKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuWWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEthOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5BZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSl9LFg6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBuYz1jLm1rfHxuYzsoZnVuY3Rpb24oYyl7Yy5vaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbWMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmthfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBuYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgb2M9Yy5va3x8b2MscGM9bmV3IG9jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sbj10aGlzLmFbMV07dGhpcy5Odz10aGlzLmFbN107dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5PcT10aGlzLmFbMV07dGhpcy5Zbz10aGlzLmFbNV07dGhpcy5hcz10aGlzLmFbM107dGhpcy53az10aGlzLmFbNl07dGhpcy5qbD10aGlzLmFbM107dGhpcy5Vdj10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVsxMF19Yy5OcD1iO2IucHJvdG90eXBlPXtRbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJuOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnc6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklrOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PcTp0aGlzLlhvKGEpfSxYbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW86dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFzOgp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLlR2KGEpfSxUdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVXY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBxYz1jLk5wfHxxYyxuZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Rbig0KTsoZnVuY3Rpb24oYyl7Yy5kaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVShhKTthJiZ0aGlzLlMoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLmRrfHxaOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlVmPTA7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPXRoaXMuZWM9dGhpcy5YYT10aGlzLkJjPSExO3RoaXMuQ2c9ZS5uYigxMCk7dGhpcy5jZygpfSxjZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT0KYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkthKCksITA7dGhpcy5VZisrO2lmKDEwPHRoaXMuVWYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLDEwMCksITF9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiYKZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PQphLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7CmJyZWFrfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuY2t8fGFhOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0KMDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIHJjPWMuZWt8fHJjLHNjPW5ldyByYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbMl07dGhpcy50aj10aGlzLmFbNl07dGhpcy5Qdz10aGlzLmFbN107dGhpcy5GaD10aGlzLmFbMTBdO3RoaXMuSWg9dGhpcy5hWzRdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMud2k9CnRoaXMuYVsxMF07dGhpcy5TbT10aGlzLmFbOV07dGhpcy5tdD10aGlzLmFbM107dGhpcy5Scz10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbMl19Yy52dD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXI6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMuT3coYSl9LE93OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qdzp0aGlzLkVoKGEpfSxFaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZoOnRoaXMuSGgoYSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaDp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndpOnRoaXMuUm0oYSl9LFJtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TbTp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXQ6CnRoaXMuUXMoYSl9LFFzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRjPWMudnR8fHRjLG9kPW5ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLmxyKDQpOyhmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSwkYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdWM9Yy5UaXx8dWM7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLApmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5zKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgdmM9Yy5TaXx8dmM7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB1YyhkKSxkLmthfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB2YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciB3Yz1jLlVpfHx3Yyx4Yz1uZXcgd2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuam09dGhpcy5hWzNdO3RoaXMuTm49CnRoaXMuYVs3XTt0aGlzLnl0PXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVs4XTt0aGlzLnpoPXRoaXMuYVs3XTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLmhrPXRoaXMuYVs5XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmFvPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMucm89YjtiLnByb3RvdHlwZT17aW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmptOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueXQ6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMueWgoYSl9LHloOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aDp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSXI6dGhpcy5nayhhKX0sZ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhrOnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubmk6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgeWM9Yy5yb3x8eWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuaW0oNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHpjPWMuWGl8fHpjOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLm9mKCl9LG9mOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5XaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyB6Yyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5rYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkgoYikpe3RoaXMuSihiKTsobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5ZaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkduPXRoaXMuYVs5XTt0aGlzLmx1PXRoaXMuYVs0XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLklpPXRoaXMuYVsxMF07dGhpcy52aj10aGlzLmFbOF07dGhpcy5rcj10aGlzLmFbMV07dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Saj10aGlzLmFbOF07dGhpcy5NaT10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs2XX1jLnlwPWI7Yi5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuR246dGhpcy5rdShhKX0sa3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmx1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSWk6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3I6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNyOnRoaXMuUWooYSl9LFFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Sajp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRGM9Yy55cHx8RGMscWQ9bmV3IERjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLkZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmVnPXRoaXMuaGc9dGhpcy5nZz0hMTt0aGlzLmVkPVtdO3RoaXMueWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIENjP251bGw6Q2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHNjP251bGw6c2MsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFVhP251bGw6VWEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBaYT9udWxsOlphLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOgplYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgaGM/bnVsbDpoYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgR2I/bnVsbDpHYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yz9udWxsOnhjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaWI/bnVsbDppYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBQYT9udWxsOlBhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFhP251bGw6cWF9fWMub2w9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5GcShhKTpbXSxiO3RoaXMuaGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2c9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuR2coYil9ZWxzZSBmb3IoYyBpbiB0aGlzLnllKXtpZih0aGlzLmVnKWJyZWFrO2I9dGhpcy55ZVtjXTt0aGlzLk9lKGIpJiYodGhpcy5lZC5wdXNoKGIpLHRoaXMuR2coYikpfX0sT2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxGcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjOwppZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMueWVbY10sdGhpcy5PZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxHZzpmdW5jdGlvbihhKXt0aGlzLk9lKGEpJiZhLmIoKX0sWnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdnKWZvcih0aGlzLmVnPSEwLGE9MDthPHRoaXMuZWQubGVuZ3RoO2ErKyl0aGlzLmVkW2FdLnRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWRbYV0udGIpfX19KShjKTt2YXIgRWM9Yy5vbHx8RWMsTD1uZXcgRWM7TC5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzFdO3RoaXMuUnQ9dGhpcy5hWzRdO3RoaXMuZ3I9dGhpcy5hWzVdO3RoaXMuTnQ9dGhpcy5hWzldO3RoaXMuYWk9dGhpcy5hWzNdO3RoaXMuYms9dGhpcy5hWzEwXTsKdGhpcy5CdT10aGlzLmFbNF07dGhpcy55cj10aGlzLmFbOV07dGhpcy5PaD10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVs5XX1jLmJuPWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5naTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5OdDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWk6dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJrOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CdTp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueXI6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9oOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEZjPWMuYm58fEZjLHJkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLmZpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlpiKGsuWXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5aYihrLlZzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ry53aWR0aD0xO0cuaGVpZ2h0PTE7Ry5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEcpO3ZhciBzZD1HLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5mYygpO0guWmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5aZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csCkguSnIoKSx7aWQ6dGR9KX0sNTAwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZ4PXRoaXMuYVsyXTt0aGlzLkV3PXRoaXMuYVsxXTt0aGlzLm9zPXRoaXMuYVs5XTt0aGlzLk9pPXRoaXMuYVs1XTt0aGlzLlhwPXRoaXMuYVs5XTt0aGlzLlpuPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzEwXX1jLlN3PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5meDp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXc6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9zOnRoaXMuTmkoYSl9LE5pOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PaTp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5abjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIEdjPWMuU3d8fEdjLHVkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLmV4KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5BZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuYWQ9MDt0aGlzLk5hPSIiO3RoaXMuZmQ9W107dGhpcy5nZD0wO3RoaXMuQmc9ITE7dGhpcy53ZT1bXX1jLm9oPWI7Yi5wcm90b3R5cGU9e0p1OmZ1bmN0aW9uKGEpe3RoaXMuQWc9YX0samQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFdTpmdW5jdGlvbihhKXt0aGlzLldhPWF9LER1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxrYzpmdW5jdGlvbihhLGIpe2UuamIoIndlbHQuZGUiKSYmZS5NYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5XYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLk5yKCkpdGhpcy5XYS5jKHRoaXMuV2EuWGMsdGhpcy5XYS5CYSx0aGlzLldhLnhlLGZ1bmN0aW9uKCl7dGhpcy5rYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLldhLk5jKTtlbHNlIGlmKHRoaXMuV3EoKSl0aGlzLnp1KGZ1bmN0aW9uKCl7dGhpcy5rYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuJHUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLkpnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklzKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5lZSYmKGM9dGhpcy5wbGF5ZXIuZWUoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZ2UoYSwKYyxmKTt0aGlzLnBsYXllci5LZyhsKX19LE5yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuYWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5hZC5nZXRUaW1lKCksdGhpcy5hZD1hLDNFNTxiPyEwOiExO3RoaXMuYWQ9YTtyZXR1cm4hMX0sVHU6ZnVuY3Rpb24oKXtlLkNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQ2YoYSkpP3RoaXMua2MoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGsuTGMsdGhpcy5wbGF5ZXIuQigpKSl9LFN1OmZ1bmN0aW9uKGEpe2UuQ2UoInBvc3Ryb2xsIik7aWYoIXRoaXMuQWcpe3RoaXMuSnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLkNmKGMpKT90aGlzLmtjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5MYyx0aGlzLnBsYXllci5CKCkpKX19LENmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxzdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk91KHRoaXMuU3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZmEoKX0sbWQ6ZnVuY3Rpb24oYSl7ZS5DZSgibWlkcm9sbCIpO2lmKCF0aGlzLm1nKXt0aGlzLm1nPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmtjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChrLkxjLHRoaXMucGxheWVyLkIoKSkpfX0scnU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5JdSh0aGlzLm1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmtlKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlR1KCk7dGhpcy5wbGF5ZXIua2UmJnRoaXMucnUoKTt0aGlzLnN1KCl9LHR1OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuZmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLlZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5nZD10aGlzLmZkLmxlbmd0aH0sV3E6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLmdkJiYoYT0hMCk7cmV0dXJuIGF9LHp1OmZ1bmN0aW9uKGEpe3RoaXMuQmc9YTtmb3IoYT0wO2E8dGhpcy5mZC5sZW5ndGg7YSsrKXRoaXMuZmRbYV1bImZ1bmN0aW9uIl0odGhpcy5ndS5iaW5kKHRoaXMpKX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5nZC0tO2EmJnRoaXMud2UucHVzaChhKTswPj10aGlzLmdkJiZ0aGlzLkJnKCl9LElzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLndlLmxlbmd0aDtjKyspYj10aGlzLndlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBoYT1jLm9ofHxoYSxTPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxMF07dGhpcy5saT10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVszXX1jLmZrPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLk52OnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5saTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZmt8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLk12KDQpfSkuY2FsbChhaXRoYWlOZ0llYmVpbG9vLGFpdGhhaU5nSWViZWlsb28pOwo=
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
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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
Tue, 27 Nov 2018 15:48:14 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 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
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
313 B
979 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=4733612357
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpdGhhaU5nSWViZWlsb289YWl0aGFpTmdJZWJlaWxvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kucGV8fCh5LnBlPTApO3kucGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5wZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk1hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5KZyhsKSxhLmdlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLnhvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLktjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuRXUobSk7YS5EdShsKTthLnR1KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubGs9dGhpcy5hWzldO3RoaXMuSnY9CnRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLkxsPXRoaXMuYVsxXTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLm1wPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuU3Y9YjtiLnByb3RvdHlwZT17a2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxrOnRoaXMuSXYoYSl9LEl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kdjp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG86dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5idihhKX0sYnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmN2OnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5tcDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgaWE9Yy5Tdnx8aWEsSWM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SWMua2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueG89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5yZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmZ1LmJpbmQodGhpcykpfWMubmo9YjtiLnByb3RvdHlwZT17cmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sem46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0sCnBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LHphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxmdTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5ldShhLmRhdGEpfSxldTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsCmNiOmJ9KX0sdGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55cShhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuamcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx5cTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYKKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0seG46ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLm5xKGEpKXJldHVybjsoYj10aGlzLnRmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxucTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxFZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LExmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxZdTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKYWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxiZzpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXQpcmV0dXJuITE7Yz10LmhlaWdodCp0LndpZHRoO2Q9dC53aWR0aDtmPXQuaGVpZ2h0OwowPnQudG9wJiYoZis9dC50b3ApO3QuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dC5sZWZ0JiYoZCs9dC5sZWZ0KTt0LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXQucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrCi4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxWZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHQ9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsCm09MzI4NTM3NzUyMCxuLGssdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPApwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXQ7az1BO3c9bDtxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmCjQyOTQ5NjcyOTU7dD10K24mNDI5NDk2NzI5NTtBPUErayY0Mjk0OTY3Mjk1O2w9bCt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHQpK2IoQSkrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHQsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix0PWMmNjMsaXNOYU4oZik/ZT10PTY0OmlzTmFOKGMpJiYodD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh0KTtyZXR1cm4gYn0sVHI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx3ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHQ9ITEsQT0hMSxrPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuc28/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxBPSF0JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KGt8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXQ7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWs7YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy53ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJgooYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtHaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxaaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxlcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxCbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sb286ZnVuY3Rpb24oKXtyZXR1cm4gYS5HaCgpfHxhLlpoKCl8fGEuZXIoKXx8YS5hbCgpfHxhLkJtKCl9fTtyZXR1cm4gYS5vbygpfSwKSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp7fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRZjpmdW5jdGlvbihhKXthPXRoaXMuSmEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxqYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHdwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LFd1OmZ1bmN0aW9uKGEsCmIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LElmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy4kZyhiKSsiOiIrdGhpcy4kZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LENlOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYiwKe2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxaYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5SYyhiLGQpKTtiJiYoaD1rLlJjKGEsYikpO2YmJihoPWsuUmMoaCxmKSk7YyYmKGg9ay5SYyhoLGMpKTtlLlpiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLm5jfHwodGhpcy5uYz17fSk7dGhpcy5uY1tmXXx8Cih0aGlzLm5jW2ZdPTApO3RoaXMubmNbZl0rKzsxMDx0aGlzLm5jW2ZdfHwoZj1tLnplKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxtLkdhKGYsITApLGY9bS5HYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixtLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxoZTpmdW5jdGlvbigpe20mJm0uYWE/bS5pc0VuYWJsZWQmJm0uTG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSw1MDApfSxTZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLldjKGEpOiIifSxXYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlVkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sCnlvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuYWUoYSl8fHRoaXMuVnIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LkhnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuRWYoYSkpcmV0dXJuIHRoaXMuRWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk1hKGEsYi51YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5aYygpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy54bihjLGEpO3JldHVybiBjfSxNYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHQpe3ZhciBrPWh8fG07aD0hMDt0JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suR2EoYSxoKTtoPWsuR2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT0KZFtxXTtyZXR1cm4gay5JYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoYSxiLGQsZixjLGssZSx0KX0uYmluZCh0aGlzKSw1MDApfSxqZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdD0hMDtlJiYodD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHQpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sc3M6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMubWMpZm9yKHZhciBjIGluIHRoaXMubWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5tY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuemIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxrZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKYy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnNzKGYuWmMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1jPWF9LFZ3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5NYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIiwKZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxwbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLAphPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFJyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLm5qfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5zeD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1qPWI7Yi5SYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuU3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHc9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07CmIuYXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnBuPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLmhuPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5sbj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ybj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuZ249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Iuam49e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlRzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmJxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Bdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5abz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLmhwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5MYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5LYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Iubm49e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLm1uPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5nZj17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuZmY9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Iuc249e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmtuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5Zdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Wcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMubWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzddO3RoaXMud3I9dGhpcy5hWzNdO3RoaXMudGg9dGhpcy5hWzRdO3RoaXMuUHM9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbMTBdfWMueGk9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLndyOnRoaXMuc2goYSl9LHNoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy50aDp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBqYT1jLnhpfHxqYSxKYz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1KYy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLm9qPWI7Yi5wcm90b3R5cGU9e1ZkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4Iil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFNjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5TYyhhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5TYyhNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGZjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVmQodGhpcy5mYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLlNjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxKcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZjKCkrIjIifSxaZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlZkKHRoaXMuQnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5TYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMub2p8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzEwXTt0aGlzLktrPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNl07dGhpcy5WcD10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs1XX1jLk1yPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eczp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2s6dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcDp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkJzOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIGthPWMuTXJ8fGthLEtjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLkNzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5UZT1ifSkoYyk7dmFyIEs9Yy5UZXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mbj10aGlzLmFbNV07dGhpcy5Waj10aGlzLmFbNl07dGhpcy5NbT10aGlzLmFbNV07dGhpcy5rbz10aGlzLmFbMl07dGhpcy5ZdD10aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbOF07dGhpcy5laj10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs2XX1jLnp3PWI7Yi5wcm90b3R5cGU9e2VuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5mbjp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlZqOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NbTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLll0OnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWo6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYT1jLnp3fHxsYSxMYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5lbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLm5sPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueWE9e307dGhpcy5BPW51bGw7dGhpcy5qYz0KMTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy5GdShiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKTowPnRoaXMueGEmJih0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYj50aGlzLnhhPyEwOiExfSxGZzpmdW5jdGlvbigpe3RoaXMub2I9MH0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZ1OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxBcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmZiKCldPWI7TCYmTC5oZyYmTC5adShiKX0sQXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5GYSh0aGlzLnlhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy55YSlpZihhPT0KdGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxTcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LE94OmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMubmx8fHI7KGZ1bmN0aW9uKGMpe2MucGw9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5qYz0xMDt0aGlzLm9iPTA7dGhpcy54YT01MDt0aGlzLks9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWI7dGhpcy5oYj0iIjt0aGlzLnlmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz0KYSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxPdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxJdTpmdW5jdGlvbihiKXt0aGlzLmxlPWJ9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV9LGtlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5vYjw9dGhpcy54YSYmKHRoaXMub2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmpjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxLZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxQeDpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5YcSgpfHx0aGlzLnVuKCk7dGhpcy5EZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHVuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLnBhKDEwKSl9LFhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LCRjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmthPSEwfSxHYjpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS2c6ZnVuY3Rpb24oYil7dGhpcy5oYj1ifSx5eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhifSxFZzpmdW5jdGlvbigpe3RoaXMuaGI9bnVsbH0sRXg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmhiJiYoYj0hMCk7cmV0dXJuIGJ9LEt4OmZ1bmN0aW9uKCl7dGhpcy55Znx8KHRoaXMueWY9ITApfSxUYzpmdW5jdGlvbigpe3JldHVybiExfSwKdng6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMucGx8fHA7KGZ1bmN0aW9uKGMpe2MucGg9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLkE9dGhpcy5wbGF5ZXI9IiI7dGhpcy5iZj0iMSI7dGhpcy5jZj0iMiI7dGhpcy4kbT0iMyI7dGhpcy5zYz0wO3RoaXMubmc9MzA7dGhpcy54Yj1bXTt0aGlzLlJhPVtdO3RoaXMuT2I9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuamY9dGhpcy5kaD0hMTt0aGlzLnN0YXR1cz10aGlzLnNjO3RoaXMuaWQ9ZS5wYSgxMCk7dGhpcy5qZChiKTt0aGlzLkd1KGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuZGh8fCh0aGlzLmRoPSEwLGUuaGUoKSl9LG9lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaWEoKT8hMToodGhpcy5MdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuV2coKSx0aGlzLmpmPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxsOmZ1bmN0aW9uKGIsYSl7dGhpcy5pYSgpfHwodGhpcy54Yi5wdXNoKGIpLHRoaXMuUmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy54YiYmMDx0aGlzLnhiLmxlbmd0aCYmKHRoaXMueGI9ZS51bmlxdWUodGhpcy54YiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMueGIuam9pbigiLCIpKSk7aWYodGhpcy5SYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlJhLmxlbmd0aDtnKyspdGhpcy5PYlt0aGlzLlJhW2ddLnJlYXNvbl09PQp0aGlzLk9iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuT2JbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuT2JbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksYj10aGlzLlJhW2ddLnJlYXNvbik7dGhpcy5PYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LER4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamZ9LG86ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJmfSxMdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuY2Z9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kbX0scGI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnNjfSxkZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5iZn0sang6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuY2Z9LAppYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5zY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sQXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSx2czpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMucGh8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Y9dGhpcy5hWzZdO3RoaXMuSnQ9dGhpcy5hWzldO3RoaXMuTWs9dGhpcy5hWzNdO3RoaXMubGw9dGhpcy5hWzJdO3RoaXMuemo9dGhpcy5hWzEwXTt0aGlzLml0PXRoaXMuYVs1XTt0aGlzLlZsPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs0XTt0aGlzLlRsPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzEwXX1jLnd0PWI7Yi5wcm90b3R5cGU9e1Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuV3Y6dGhpcy5JdChhKX0sSXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkp0OnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Nazp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpqOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pdDp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVmw6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9wOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5UbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIG5hPWMud3R8fG5hLE1jPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Wdig0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpOwp2YXIgVD1jLnBpfHxUOyhmdW5jdGlvbihjKXtjLm9pPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy52ZD1udWxsO3RoaXMuZHc9MUUzO3RoaXMueGc9bnVsbDt0aGlzLnh2PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5zbyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLmdxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5UcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLlNxKGEsYil9LmJpbmQodGhpcykpO2IudnBFdmVudCYmKGIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5ndyhiKX0uYmluZCh0aGlzKSksYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuaHcoYil9LmJpbmQodGhpcykpKTsKYi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuUnEoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLmZwKGEpfS5iaW5kKHRoaXMpKX0sZnA6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxndzpmdW5jdGlvbihiKXt0aGlzLnZkfHwodGhpcy52ZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaXcoYil9LmJpbmQodGhpcyksdGhpcy5kdykpfSxpdzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCk7dGhpcy53KCl9LGh3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZkKX0sUnE6ZnVuY3Rpb24oYil7dGhpcy5xeChiKTt0aGlzLnhnPW5ldyBEYXRlO3RoaXMueGctdGhpcy5idTx0aGlzLnh2P3RoaXMudygpOnRoaXMubygpfSxUcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmpkKG5ldyBUKGEpKSk7CnRoaXMudygpfSxncTpmdW5jdGlvbigpe30sU3E6ZnVuY3Rpb24oKXt0aGlzLmJ1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIG9hPWMub2l8fG9hOyhmdW5jdGlvbihjKXtjLnJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuRmEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyBvYShnLHRoaXMuQSkpLmIoKSl9fXRoaXMuSSgpfX19KX0pKGMpO3ZhciBwYT1jLnJpfHxwYSxxYT1uZXcgcGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnA9dGhpcy5hWzhdO3RoaXMuaT0KdGhpcy5hWzFdfWMuZmw9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnZwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcmE9Yy5mbHx8cmEsTmM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudXAoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt0aGlzLkRmKCk7dGhpcy5GZigpO3RoaXMuZ3A9ITF9LERmOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuRWI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlOwp0aGlzLlMoYil9LEZmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3ZhciBiPXRoaXMuRWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkViPSEwKTt0aGlzLlUoYSl9fSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmCigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKSl9LGtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMubWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpKX0sbWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmCmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5sZSYmKDAsdGhpcy5sZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LAp2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxUYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuT2p8fHNhOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5zYzt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJgooYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMub2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm5nJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5ncD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEucWUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMub2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmcmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy53Yy5pbmRleE9mKGEpJiYKdGhpcy53Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMud2MubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LHZzOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuUGQ/dGhpcy5QZCsrOnRoaXMuUGQ9MTp0aGlzLk9kP3RoaXMuT2QrKzp0aGlzLk9kPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLll1KGEudmlkZW9UYWcpP2EuRWI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy51Y3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLk9kPnRoaXMuUGQmJihiPSExKSx0aGlzLncoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5EZigpLGEuRmYoKSxhLkVifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHRhPWMuTmp8fHRhOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuSmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5TcihnKXx8KHRoaXMuSihnKSxnPW5ldyB0YShnLHRoaXMuQSksCmcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0seHg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sd3E6ZnVuY3Rpb24oKXt2YXIgYj1lLkphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLlBqfHx1YSx2YT1uZXcgdWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3A9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuVmk9YjtiLnByb3RvdHlwZT17RnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgd2E9Yy5WaXx8d2EsT2M9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLkZwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLkRtfHx4YTsoZnVuY3Rpb24oYyl7Yy5DbT11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB5YT1jLkNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5FbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJgp3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgemE9Yy5FbXx8emEsQWE9bmV3IHphKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh2PXRoaXMuYVs1XTt0aGlzLktwPXRoaXMuYVs3XTt0aGlzLkN3PXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVsyXTt0aGlzLlpzPXRoaXMuYVs5XTsKdGhpcy5QcD10aGlzLmFbNl07dGhpcy5jdD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbMTBdO3RoaXMuUHY9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbM119Yy5HaT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHY6dGhpcy5KcChhKX0sSnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLktwOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddzp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5ZcyhhKX0sWXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpzOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QcDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3Q6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnppOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuUHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLkdpfHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5Hdig0KTsoZnVuY3Rpb24oYyl7Yy52bT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlUoYik6dGhpcy5lYSgpKTp0aGlzLmVhKCl9ZWxzZSB0aGlzLmVhKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgQ2E9Yy52bXx8Q2E7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT10aGlzLmVjPXRoaXMuWGE9dGhpcy5CYz0hMTt0aGlzLkNnPWUubmIoMTApO3RoaXMuYmg9ITA7dGhpcy5HZD10aGlzLldmPSExO3RoaXMuc2coKTt0aGlzLklvKCk7dGhpcy5LYSgpfSxMeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLHR5cGVvZiBiLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuVz9iLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkYsIjsiLHR5cGVvZiBiLkYsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5zYT9iLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLnNhP3R5cGVvZiBiLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi56ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5BZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuRmQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5GZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNnKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxVYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj10aGlzLmdiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5tYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5tYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5tYX0sTmY6ZnVuY3Rpb24oKXtpZighdGhpcy5lYyl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5lYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmVjfSwKUXI6ZnVuY3Rpb24oKXtpZighdGhpcy5WZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5PcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVmY9ITApfXJldHVybiB0aGlzLlZmfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuQmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkJjPSEwKTtyZXR1cm4gdGhpcy5CY30sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuQWUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLkdkPSEwO3ZhciBiPXRoaXMuTmYoKTtpZihifHx0aGlzLmlhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuU2I9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLlNiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5TYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuWSgpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHd4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5zZiYmYi5hZHMmJih0aGlzLnNmPWIuYWRzKTtyZXR1cm4gdGhpcy5zZn0sSW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMub2UoKX0uYmluZCh0aGlzKSl9LHZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5OZigpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmYoKX0uYmluZCh0aGlzKSw1MCl9LHNnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPApiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5RcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlVjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlVjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLmdiKCl9ZWxzZSB0aGlzLldmP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nYigpLGI9dGhpcy5VYygpO2EmJiFiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWSgpKToodGhpcy5ZKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxKbzpmdW5jdGlvbigpe3RoaXMuV2J8fCh0aGlzLldiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5XYiE9Yi5hZHMuc3RhdGUmJih0aGlzLldiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLldiKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuV2I9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpvKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITA7dGhpcy5vKCJlbXB0eSB2YXN0Iil9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLmJoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLmJoLGZ1bmN0aW9uKCl7dGhpcy52ZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxPbzpmdW5jdGlvbigpe3RoaXMuR3h8fCgxMDx0aGlzLmV3Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApKToodGhpcy5ldysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9vKCl9LmJpbmQodGhpcyksNTApKSl9LHV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5mdyl7dGhpcy5mdz0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy51bXx8RGE7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUGcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLlBnKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LFBnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTt2YXIgRWE9Yy53bXx8RWEsRmE9bmV3IEVhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl3PXRoaXMuYVs5XTt0aGlzLkN2PXRoaXMuYVs5XTt0aGlzLlhzPXRoaXMuYVs2XTt0aGlzLkh0PXRoaXMuYVs0XTt0aGlzLiR0PXRoaXMuYVs2XTt0aGlzLnhoPXRoaXMuYVs3XTt0aGlzLlh3PXRoaXMuYVs3XTt0aGlzLnNtPXRoaXMuYVszXTt0aGlzLlFtPQp0aGlzLmFbN107dGhpcy5xbT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs0XX1jLmpwPWI7Yi5wcm90b3R5cGU9e0h3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jdzp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3Y6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhzOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdDp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuJHQ6dGhpcy53aChhKX0sd2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhoOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ydzp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnFtOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgR2E9Yy5qcHx8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSHcoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksCmc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApOwpyZXR1cm4gYn0sVGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuUWx8fEhhOyhmdW5jdGlvbihjKXtjLlBsPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm9jPSExO3RoaXMuRGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5vYz0KITAsdGhpcy5vKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy5HYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLnBmKCk6dGhpcy5vKCl9LEdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm9jPSEwLHRoaXMubygpOwp0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMub2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5HYy5iaW5kKHRoaXMpLDEwMCl9fSxwZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSwKdGhpcy5vKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGYuYmluZCh0aGlzKSw1MCl9fSxEZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7CmIuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5vYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5QbHx8SWE7KGZ1bmN0aW9uKGMpe2MuUmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiYKdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuUmx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbMTBdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuRXA9dGhpcy5hWzldO3RoaXMuT2s9dGhpcy5hWzhdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuTHc9dGhpcy5hWzEwXTt0aGlzLm5oPXRoaXMuYVsyXTt0aGlzLnFwPXRoaXMuYVs2XTt0aGlzLlZuPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLkRsPWI7Yi5wcm90b3R5cGU9e1p3OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuJHc6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxzOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FcDp0aGlzLk5rKGEpfSxOazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2s6dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJpOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbjp0aGlzLkt3KGEpfSxLdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHc6dGhpcy5taChhKX0sbWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5oOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcDp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZuOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5EbHx8TGEsUmM9bmV3IExhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLlp3KDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMucmc9YX0sTjpmdW5jdGlvbigpe30saWU6ZnVuY3Rpb24oYil7dGhpcy5yZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5yZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5RaHx8TWE7KGZ1bmN0aW9uKGMpe2MuUGg9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0saWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLlBofHxOYTsoZnVuY3Rpb24oYyl7Yy5SaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuaWUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuaWUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5SaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuVms9dGhpcy5hWzEwXTt0aGlzLkhvPXRoaXMuYVs5XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLmppPXRoaXMuYVs4XTt0aGlzLkZ2PXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5zdD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs5XX1jLnl1PWI7Yi5wcm90b3R5cGU9e3dqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlVrKGEpfSxVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ibzp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSWo6dGhpcy5paShhKX0saWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmppOnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdjoKdGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFrOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54czp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3Q6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBRYT1jLnl1fHxRYSxTYz1uZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53aig0KTsoZnVuY3Rpb24oYyl7Yy50az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksCmE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLnRrfHxSYTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnZjKCl9LmJpbmQodGhpcykpLAokKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSkpOnRoaXMudmMoKX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuc2t8fFNhOyhmdW5jdGlvbihjKXtjLnVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj0KbmV3IFJhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgU2EoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRhPWMudWt8fFRhLFVhPW5ldyBUYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdz10aGlzLmFbNV07dGhpcy4kcT10aGlzLmFbMl07dGhpcy5VbT10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzRdO3RoaXMuRm89dGhpcy5hWzRdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOF19Yy5BbT1iO2IucHJvdG90eXBlPXtRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRxOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLkJqOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLkFtfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Rdyg0KTsoZnVuY3Rpb24oYyl7Yy5jbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLnJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYKKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxjdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5xZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMucmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLAoiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnJlKys7aWYoMTA8dGhpcy5yZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpOwp2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLmNsfHxXYTsoZnVuY3Rpb24oYyl7Yy5ibD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlJkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUmQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsCmEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLlhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJgohdGhpcy5lcT8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5lcT0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuY3UoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuYmx8fFhhOyhmdW5jdGlvbihjKXtjLmRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5kbHx8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVzPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVsxMF07dGhpcy5Hdz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs3XX1jLlpyPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLkhtKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd3OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyICRhPWMuWnJ8fCRhLFVjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLmRzKDQpOyhmdW5jdGlvbihjKXtjLmpqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5VKGIuZWxlbWVudCl9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sCnZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciBhYj1jLmpqfHxhYjsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgYmI9Yy5panx8YmI7KGZ1bmN0aW9uKGMpe2Mua2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLApmdW5jdGlvbihiKXtiPW5ldyBhYihiLmRldGFpbCk7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYmIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBjYj1jLmtqfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanU9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzFdO3RoaXMuVGo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzEwXTt0aGlzLmt0PXRoaXMuYVsyXTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qdTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5TaihhKX0sU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRqOgp0aGlzLktyKGEpfSxLcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHI6dGhpcy5qdChhKX0sanQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmt0OnRoaXMuc3AoYSl9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmw6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBlYj1jLkRyfHxlYixWYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy5pdSg0KTsoZnVuY3Rpb24oYyl7Yy5Eaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5MZihiLCJlbGVtZW50SUQiKTt0aGlzLnpnPWIucG9zaXRpb25pbmc7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuUGM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5QYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApObzpmdW5jdGlvbigpe2UuYWcodGhpcy5QYyk7ZS5iZyh0aGlzLlBjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTm8oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBmYj1jLkRqfHxmYjsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZ2I9Yy5Danx8Z2I7KGZ1bmN0aW9uKGMpe2MuRWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy54YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuTGYoYiwiZWxlbWVudElEIik7ZS5hZyhhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMudGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGhiPWMuRWp8fGhiLGliPW5ldyBoYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLll3PWI7Yi5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Lbjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuWXd8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLkpuKDQpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMucGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sSHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx2bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLnBqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuUGE9YTt0aGlzLkhmPXRoaXMubGg9ITE7dGhpcy50Zz1kO3RoaXMuUWc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuUGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8CjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLmJlKHRoaXMuUGEudXJsKSYmbS5yZCl7dmFyIGg9bmV3IHooYS51cmwpO2guSHUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLnFqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBhLmRhdGE7CmlmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5IZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUWc/dGhpcy52Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCExKTp0aGlzLnZiLm9wZW4odGhpcy5QYS5tZXRob2QsdGhpcy5QYS51cmwsITApLHRoaXMubGh8fCh0aGlzLnZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx0aGlzLnZiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5iZSh0aGlzLlBhLnVybCk/bS5yZD9tLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLmJlKHRoaXMuUGEudXJsKSwKdGhpcy50ZyYmdGhpcy50ZygpfXJldHVybiB0aGlzLnZifX19KShjKTt2YXIga2I9Yy5xanx8a2I7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuVWI9IiI7dGhpcy5IZD10aGlzLlRiPXRoaXMuZWI9bnVsbDt0aGlzLnhwPXRoaXMucWI9dGhpcy5pZz0hMTt0aGlzLnVhPSIiO3RoaXMuZGc9ITE7dGhpcy5CYT10aGlzLlhjPSIiO3RoaXMuJGY9dGhpcy5hYT10aGlzLmlzRW5hYmxlZD10aGlzLnhlPSExO3RoaXMuT2E9W107dGhpcy5UZj10aGlzLkliPSIiO3RoaXMuTmQ9ITE7dGhpcy5LZT0wO3RoaXMuWGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5WZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMucmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjsKdGhpcy5LYj0iIjt0aGlzLnJiPVtdO3RoaXMuTGI9W107dGhpcy5KYj0iIjt0aGlzLkxlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuWGQ9ITE7dGhpcy5Qbz10aGlzLnNkPW51bGw7dGhpcy5OZz10aGlzLnBjPXRoaXMuQWY9dGhpcy5OZT10aGlzLnJkPXRoaXMuSWQ9dGhpcy50Yz0hMTt0aGlzLlNhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLnJqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuVWIsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5UYixhZHRhZ3JlZ2V4OnRoaXMuSGQsanNwb3B1cHM6dGhpcy5pZyxzaWRlbG9hZHM6dGhpcy5xYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMudWEsaXNJbml0aWFsaXplZDp0aGlzLmRnLGdsb2JhbENvbmZpZzp0aGlzLlhjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCwKaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLiRmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkliLGhvbWFkQWRwYXRoOnRoaXMuVGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5OZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5LZSxIT01BRF9WRVJJRklFRDp0aGlzLlhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5WZSxIT01BRF9OT0JMT0NLRVI6dGhpcy53YixIT01BRF9BREJMT0NLRVI6dGhpcy5yYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuV2UsdGVzdEhpZGU6dGhpcy5LYix0ZXN0VGFnczp0aGlzLnJiLHRlc3RUYWdzSlM6dGhpcy5MYix0ZXN0Q29va2llOnRoaXMuSmIsdGhyb3R0bGU6dGhpcy5MZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLlhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuUG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy50YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuSWQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucmQsCnVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLk5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkhiLHNlcnZlcklkOnRoaXMuSWcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlliLHZwYWlkOnRoaXMucGMsc2tpcEFsbG93ZWQ6dGhpcy5OZ319LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJihhPSEwKTtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dGhpcy5TYVthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxwZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5wbyhhKX0sR2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixsPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLmFlKGEpO2U9dGhpcy5KYShhKTtjPyh0aGlzLmdjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsbD1lLnBhdGguc3Vic3RyKDEpKTooaD10aGlzLnplKCksbD1lLnBhdGguc3Vic3RyKDEpKyhlLnF1ZXJ5PyI/IitlLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuVWJ8fHRoaXMuZWJ8fAp0aGlzLlRifHx0aGlzLkhkKSYmKGw9dGhpcy5OcyhsKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnpxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1sO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGwpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmdjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTsKcmV0dXJuIGJ9LGdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxiZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLmFlKGEpO3JldHVybiBifSx6cTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudWEmJjA8dGhpcy51YS5sZW5ndGgpcmV0dXJuIHRoaXMudWE7Zm9yKGQgaW4gdGhpcy51YSlpZihiPXRoaXMudWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09CmEpcmV0dXJuIGIub3g7cmV0dXJuIm5vbmUifSxaYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMuSWddfSx6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWmMoKSxiPXRoaXMuTWcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb2c6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLkphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEQ9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksCmM9e30sbD0wO2w8RC5sZW5ndGg7bCsrKXt2YXIgdD1EW2xdLnNwbGl0KCI9Iik7Y1t0WzBdXT10WzFdfWZvcih2YXIgayBpbiBiW2hdLnN1YnZhbHVlcyljW2tdPXRoaXMub2coY1trXSxrLGJbaF0uc3VidmFsdWVzW2tdKTtEPVtdO2ZvcihrIGluIGMpRC5wdXNoKGsrIj0iK2Nba10pO2M9RD1lbmNvZGVVUklDb21wb25lbnQoRC5qb2luKCImIikpfWVsc2UgYz10aGlzLm9nKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9az1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWsucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sTnM6ZnVuY3Rpb24oYSl7dGhpcy5VYiYmKGErPXRoaXMuVWIpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3RoaXMuVGImJihhPXRoaXMuTXMoYSx0aGlzLlRiKSk7cmV0dXJuIGF9LApjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5kZz0hMDt0aGlzLlhjPWE7dGhpcy5CYT1iO3RoaXMueGU9ZDt0aGlzLnNkPWM7dGhpcy5OYz1lO3RoaXMuSGI9aHx8e307dGhpcy5ycygpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5CYSl0aGlzLnBzKCk7ZWxzZSB0cnl7dGhpcy5CYT1iKCksdGhpcy5JYygpfWNhdGNoKGwpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scnM6ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyB6KHRoaXMuWGMrdGhpcy56YygiZ2xvYmFsIikpLHRoaXMuTXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5JYygpfS5iaW5kKHRoaXMpLAohMCl9LHBzOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnpjKCJjbGllbnQiKSk7dGhpcy5JYShuZXcgeih0aGlzLkJhK3RoaXMuemMoImNsaWVudCIpKSx0aGlzLkljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx6YzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5uYigpO3RoaXMuSGImJnRoaXMuSGIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkhiJiZ0aGlzLkhiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSWQpe3RoaXMuSWQ9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07CnRoaXMuTmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OYz90aGlzLk5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmFhPXRoaXMuJGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVmUpKTt0aGlzLnViKCk7ZS5aYihrLlN0KTsoYj1lLlFmKHRoaXMuWmMoKSkpfHwoYj1lLlFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxNcTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5JYnx8dGhpcy51YXx8dGhpcy5JYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX19LEljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuT2E9YS5zZXJ2ZXJ8fFtdO3RoaXMuSWI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLlRmPWEuYWRwYXRofHwiIjt0aGlzLk5kPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuSWc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuT2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYiYmdGhpcy51YSYmdGhpcy5PYS5sZW5ndGg/dGhpcy5iZCghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSx0aGlzLnViKCkpfSxiZDpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy56ZSgpKSxjPXRoaXMuSmEodGhpcy5JYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkliK3RoaXMuemMoImN1c3RvbWVyIikpO3RoaXMuSWEoYix0aGlzLmF2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjdXN0b21lciIpO2E/dGhpcy5FbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLkVsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZCghMCl9LmJpbmQodGhpcyksCjEwMCkpOnRoaXMuYmQoITApfS5iaW5kKHRoaXMpLCEwKX19LGF2OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fXRoaXMucmQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy5OZT10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFmPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5ZYj10aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuS2I9Yi50ZXN0aGlkZXx8IiI7dGhpcy5yYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5VYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlRiPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5IZD1iLmFkdGFncmVnZXh8fApudWxsO3RoaXMuaWc9Yi5qc3BvcHVwc3x8ITE7dGhpcy5xYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5wYz1iLnZwYWlkfHwhMTt0aGlzLkhiLnZwYWlkPXRoaXMucGM7dGhpcy5OZz1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkVjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5KYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5OZCYmKHRoaXMuSmI9bnVsbCk7dGhpcy5MZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLlhkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5YZD0hMCx0aGlzLmJkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnN2KCkmJih0aGlzLktifHx0aGlzLkxifHx0aGlzLnJifHx0aGlzLkpiKT90aGlzLnhlPyh0aGlzLm9hPXRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSwKdGhpcy5KZCgpLHRoaXMudWIoKSk6dGhpcy5odigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLml2KCkpfX0saHY6ZnVuY3Rpb24oKXt0aGlzLmd2KCl9LGl2OmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKX0scWQ6ZnVuY3Rpb24oYSl7dGhpcy50Yz0hMDt0aGlzLmFhfHwodGhpcy5hYT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYShhKSksdGhpcy51YigpLHRoaXMuSmQoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5LYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLktiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5xZCh0aGlzLnJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VZygpfWVsc2UgdGhpcy5VZygpfSxUZzpmdW5jdGlvbigpe3ZhciBmO3ZhciBjO2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5uYigpKTt0aGlzLmx2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5IZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5yYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMucmI9bnVsbCx0aGlzLkhlKCl9LGx2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7ZSgpJiYKYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0sVWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoKSk7dGhpcy5tdihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLnFkKHRoaXMucmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuTGImJnRoaXMuTGIubGVuZ3RoKXt2YXIgYz10aGlzLkxiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVGcoKX0sbXY6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtoKCkmJmIoKX1mdW5jdGlvbiBlKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gbD8od2luZG93LmNsZWFyVGltZW91dChsKSwhMCk6ITF9dmFyIGw9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChtKXtmKCl9fSxIZTpmdW5jdGlvbigpe3RoaXMuSmI/KHRoaXMuS2UrKyx0aGlzLklhKG5ldyB6KHRoaXMuSmIpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuSWUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5SZygpfSxJZTpmdW5jdGlvbihhKXt0aGlzLnFkKHRoaXMuV2UsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuS2U/dGhpcy5IZSgpOnRoaXMuSWUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlJnKCk6dGhpcy5JZSgiQUFBIil9LFJnOmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKTt0aGlzLkpkKCl9LHViOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMudGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlhlKSk7CnRoaXMuc2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5zZCYmdGhpcy5zZCgpfSxNbzpmdW5jdGlvbigpe2lmKHRoaXMuTmUmJnRoaXMuVnEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sV2c6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsYyxmLGgsRCl7YT1uZXcga2IoYSxiLGMpO2YmJihhLmxoPSEwKTtoJiZlLlRyKCkmJihhLkhmPSEwKTtEJiYoYS5RZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxuZjpmdW5jdGlvbigpe2UuWWEoKXx8ZS5NYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmdjKCl8fChhPXRoaXMuSmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKaC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5oYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sTG86ZnVuY3Rpb24oKXt0aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5JYShhLHRoaXMuJHYuYmluZCh0aGlzKSx0aGlzLlp2LmJpbmQodGhpcykpfSwkdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuY3EoKX0sWnY6ZnVuY3Rpb24oKXt9LGNxOmZ1bmN0aW9uKCl7ZS5aYihrLmJxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxKZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnFiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMucWIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMucWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuTWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLmZjKCldPXRoaXM7ZS5NYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxzdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLkxlfSxIcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxsLGssbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsbD0oZiYxNSk8PDJ8ZT4+NixrPWUmNjMsaXNOYU4oZik/bD1rPTY0OmlzTmFOKGUpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHUseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTQwOzU5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfG4md3xwJncpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBsYj1jLnJqfHxsYixtPW5ldyBsYjt3aW5kb3cudHg9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vdT10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbN107CnRoaXMuRW49dGhpcy5hWzZdO3RoaXMuUXE9dGhpcy5hWzJdO3RoaXMueWs9dGhpcy5hWzVdO3RoaXMudWk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbN119Yy5GaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub3U6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fbjp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUXE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlrOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIG1iPWMuRml8fG1iLFhjPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5udSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmY9YTthLnUuTD90aGlzLk5hPWEudS5MKCk6dGhpcy5OYT0iIjt0aGlzLmNvbnRhaW5lcj10aGlzLmYuVGE7dGhpcy5wbGF5ZXI9dGhpcy5mLnU7dGhpcy5BYj10aGlzLkNjPSExO3RoaXMubm89MUUzO3RoaXMuZGE9bnVsbDt0aGlzLlA9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5vZD17fTt0aGlzLkFjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuQWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5mLnUpJiZ0aGlzLmYudS5CJiYoYT10aGlzLmYudS5CKCkpLHRoaXMuQWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7CnRoaXMubmQ9ITE7dGhpcy5sZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5tPXt9O3RoaXMueWM9ITE7dGhpcy5aZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkRiPSExO3RoaXMuaXA9ZS5wYSgxMCk7dGhpcy5kZD1lLnBhKDEwKTt0aGlzLm1lPWUucGEoMTApO3RoaXMuT2c9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWGI9dGhpcy5rYj0hMTt0aGlzLlFkPW51bGw7dGhpcy5aZD10aGlzLnVlPXRoaXMuS2Q9dGhpcy5NYz10aGlzLkdlPXRoaXMudmc9dGhpcy5RYz10aGlzLnl2PXRoaXMuYWI9ITF9Yy5saj1iO2IucHJvdG90eXBlPXtKZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxYZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuSGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuUC50Yz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQoay5tbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpfSxnZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuUC5hYSl0aGlzLlAuTW8oKSx0aGlzLlAub2EmJnRoaXMuUC5pc0VuYWJsZWQ/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5QLnBjfSkpOmI/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUC5wYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQ2EoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZ2UoYSwKYixjKX0sNTApfX0sc2U6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMTt0aGlzLm09YTt0aGlzLlB1KHRoaXMubSk7dGhpcy5SZihhKX0sUmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMub2Q9dGhpcy5KcShhKSksdGhpcy5SZihhLnBhcmVudCkpfSxKcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWil7Yj1hLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5aLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmCihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZ2E6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLk9jJiZhLk9jLmVycm9yJiZhLk9jLmVycm9yLmNvZGUmJihiPWEuT2MuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5xYy5jb2RlOmI9PUUueGQuY29kZT9lLkQoay50dyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpOihlLmhlKCksYj09RS4kZS5jb2RlJiZlLkQoay5Ucyx0aGlzLm0uUix0aGlzLmYudS5CKCksCnRoaXMuVCgpKSk7ZS5EKGsuYXEsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB4LlllLmNvZGU6ZS5EKGsuYXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LmFmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGsuQXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC55ZC5jb2RlOmUuRChrLkp3LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC53ZC5jb2RlOmUuRChrLlVzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLAp0aGlzLlhifHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLmxhJiYoYys9Il8iK2EuZXJyb3IubGEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5CYihhKTt0aGlzLkNhKCl9LEJiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5BYS5sZW5ndGg7KXRyeXt2YXIgYz1hLkFhLnBvcCgpO3RoaXMuZmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LFB1OmZ1bmN0aW9uKGEpe3RoaXMuS2Q9dGhpcy5aZD10aGlzLnVlPSExO3RoaXMucmE9dGhpcy5mLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmYuQzsKYi5NeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuQW4mJnRoaXMucGxheWVyLlRjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5UYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuTS5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5NW2NdLnR5cGUpJiZ0aGlzLnduKGIsYS5NW2NdLnVybCsiIixhLk1bY10udHlwZSk7dGhpcy5WZyhiKT8odGhpcy55bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmRhPQp0aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5tLmNwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5OdSgpKTp0aGlzLiRkKCk/dGhpcy5MZygpOnRoaXMubS5vcmlnaW4uQmYoeC53ZCl9LE51OmZ1bmN0aW9uKCl7ZS5yZigpO3RoaXMubSYmdGhpcy5tLm9yaWdpbiYmdGhpcy5tLm9yaWdpbi5TZSYmZS56bih0aGlzLm0ub3JpZ2luLlNlKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5mLkM7dGhpcy5mLkM9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuZi5DLGEpO3RoaXMuZi53ZygpOwp0aGlzLmYubGMoKTtmb3IoYT10aGlzLmYuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5mLmxjKCk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5mLkcuYXBwZW5kQ2hpbGQodGhpcy5PKTt0aGlzLk8ub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLkxxKCksYj10aGlzLm0uUi5PcmlnaW5hbEFkUGFyYW1ldGVycywKYz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDphLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTphLmRlc2lyZWRCaXRyYXRlfHxhLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpifSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuZi5HLnN0eWxlLmhlaWdodCl9fX07ZS56YSh0aGlzLk8sImNvbmZpZyIsYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnlvKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuUCk7dGhpcy5PLnNyYz1hO2UuRWQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt3KGEpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMubHcoKSx0aGlzLmYuY2MoITApKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmYuY2MoITApLHRoaXMubncoKSksIkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmNjKCEwKSx0aGlzLnJ3KCkpLCJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB3KCksIkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF3KCksIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coKSwiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3coKSwiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaWgoKSl9LmJpbmQodGhpcykpOwplLkVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcykpO2UuRWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmYudG4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxudzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpfSxsdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIil9LHJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlFhKCJzdGFydCIpfSxwdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtlLlFhKCJmaXJzdFF1YXJ0aWxlIil9LHF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpfSxzdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlFhKCJ0aGlyZFF1YXJ0aWxlIil9LApvdzpmdW5jdGlvbigpe3RoaXMudGQoKTtlLlFhKCJjb21wbGV0ZSIpfSxpaDpmdW5jdGlvbihhKXtpZih0aGlzLk8mJnRoaXMuTy5wYXJlbnROb2RlJiZ0aGlzLk8ucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLlFhKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLk8ucGFyZW50Tm9kZTt0aGlzLk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLk8pO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTt0aGlzLk89ZS5iYT0hMTt0aGlzLkNhKGEpfX0sa3c6ZnVuY3Rpb24oYSl7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLm1lc3NhZ2UsITApO2UuUWEoImVyciIsYS5tZXNzYWdlKTt0aGlzLmloKCEwKX0sd246ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5QO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5nYygpPyhmPWUuSmEoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsCiJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuY3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LHluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhoLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuUGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGg6ZnVuY3Rpb24oYSl7dGhpcy5BYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFifHx0aGlzLlBlKGEpfS5iaW5kKHRoaXMpLHRoaXMubm8pKX0sUGU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuQ2MmJnRoaXMuVmcodGhpcy52aWRlbykmJiF0aGlzLmtiJiYhdGhpcy5BYil7dGhpcy5DYz0hMDt0cnl7aWYoIWUuWWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMubS5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMua2J8fCh0aGlzLmtiPSEwLHRoaXMuaGQodGhpcy52aWRlbyksCmUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuUC5BZnx8dGhpcy5QLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuQ2EoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwiIiwhMCl9dGhpcy5idygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5mLmxjKCk7dGhpcy5laCgpO3RoaXMuZmgoKTt0aGlzLmxmKCk7dGhpcy5mLndnKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZlKCl9fSxGZTpmdW5jdGlvbigpe2lmKCF0aGlzLk1jKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuSGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuWWM9W107Zm9yKHZhciBiPXRoaXMuZi5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlljLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PQoibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMueGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsCmIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhjKCl9ZWxzZSB0aGlzLnhjKCl9LHhjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuWWMpZm9yKHZhciBiPTA7Yjx0aGlzLlljLmxlbmd0aDtiKyspdGhpcy5ZY1tiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5NY3x8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuQ2EoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLnBnKCEwKSx0aGlzLnhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLlpkJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy51ZT0hMH0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5GYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkZiLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LmJpbmQodGhpcyk7dGhpcy5UZCgpLktnKHRoaXMpfSx0ZDpmdW5jdGlvbigpe3RoaXMuUC5ZYiYmIXRoaXMua2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChrLmduLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5DYSgpfSxDYTpmdW5jdGlvbihhKXtpZighdGhpcy5LZClpZih0aGlzLktkPSEwLHRoaXMubS4kYXx8dGhpcy5tLlBiKXt0aGlzLkFiPXRoaXMuQ2M9ITE7dHJ5e3RoaXMuaGQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5uZD0hMTt0cnl7dGhpcy5mLmFoKCl9Y2F0Y2goZSl7fXRoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5EYj0hMTt0aGlzLlRkKCkuRWcoKTt0aGlzLm0uJGEmJnRoaXMubS5vcmlnaW4ubmUoKTt0aGlzLm0uUGImJihhP3RoaXMubS5vcmlnaW4ucWcoKTp0aGlzLkxkKCkpfWVsc2UgdGhpcy5MZCgpfSxjdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuJGQoKT90aGlzLkxnKCk6dGhpcy51ZChhKSl9LHVkOmZ1bmN0aW9uKGEpe3RoaXMuQWI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLiRkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHx0aGlzLlAubmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUC5uZigpKTt0aGlzLm0ub3JpZ2luLkJmKHgud2QpfSxRZTpmdW5jdGlvbigpe2lmKHRoaXMueXYpdGhpcy5DYSgpO2Vsc2V7dGhpcy5EYj0hMDt0aGlzLmYudS5sYiYmIXRoaXMuR2UmJnRoaXMuZi51LmxiKCkmJmUuRChrLktjLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLkR2KGEpO3ZhciBiPSIiO2lmKHRoaXMubS5FZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PZyk7YyYmKGI9dGhpcy5tLkVlLWEsMDxiP2I9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYik6KGI9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKSx0aGlzLm5kfHwodGhpcy5uZD0hMCxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGsubm4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLm0uJGE/KHRoaXMuQWI9dGhpcy5DYz0hMSx0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMubmQ9ITEsdGhpcy5mLmFoKCksdGhpcy5tLm9yaWdpbi5uZSgpKTp0aGlzLkNhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9Yil9dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsZS5JZih0aGlzLm0uZHVyYXRpb24tYSkpKTt0aGlzLnljPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxMZzpmdW5jdGlvbigpe3RoaXMuWGI9ITA7dGhpcy5yYT10aGlzLmYuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuRXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5mLkM9YTt2YXIgYj10aGlzLmYuQyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5mLmxjKCk7dGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyk7dGhpcy5kYS5hcHBlbmRDaGlsZChiKTt0aGlzLmVoKCk7dGhpcy5maCgpO3RoaXMuUWQ9c2V0SW50ZXJ2YWwodGhpcy5Lby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMubS5NLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5tLk1bY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUDtoLm9hJiZoLmlzRW5hYmxlZCYmIWguZ2MoKSYmKGU9aC5KYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LEtvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLm0uZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5RZCksdGhpcy50ZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLlFlKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLlFkKSwKdGhpcy51ZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFlnOmZ1bmN0aW9uKCl7dGhpcy52Z3x8KHRoaXMudmc9ITAsdGhpcy5RY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LER2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuWmd8fHRoaXMua2J8fCgwPT1hJiYodGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSksdGhpcy51ZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5aZD0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5ZZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuWWcoKX0uYmluZCh0aGlzKSksCnRoaXMuWGImJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLmtifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS5EKGsuam4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLkQoay5wbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWGImJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5ZYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuUWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQoay5obix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxhPT0KTWF0aC5mbG9vcih0aGlzLm0uZHVyYXRpb24vMikmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUuRChrLmxuLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLm0uZHVyYXRpb24vNCkmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLkQoay5ybix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxlLkQoay5zbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWmc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMua2Ipe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9CnRoaXMuS3EodGhpcy5tLkFhLGEpO2MubGVuZ3RoOyl0cnl7dmFyIGY9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMub2QuaW1wcmVzc2lvbnMmJmUuUnIoZi51cmwsdGhpcy5vZC5pbXByZXNzaW9ucyk/dGhpcy5mZShmLnVybCxmLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5EKGsua24sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpLHthZElkOnRoaXMub2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9KX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmZlKGYudXJsLGYudHlwZSl9Y2F0Y2goaCl7fWJ8fCh0aGlzLm0uQWE9dGhpcy5ycCh0aGlzLm0uQWEsYSkpfX0sZmU6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5QLkdhKGEpLGMmJmEudm4oYyksZnx8KGY9dGhpcy56ZiksdGhpcy5QLklhKGEsZix0aGlzLnpmLCExLCEwKSl9LEtxOmZ1bmN0aW9uKGEsCmIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHJwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyl9LGdoOmZ1bmN0aW9uKCl7ZS5EKGsuWm8sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7IXRoaXMuUWMmJmUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuc3EoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5tLkhjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMubS5IYywKdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIil9fSxlaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsCmUuSWYoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuUC5FYyYmKGI9dGhpcy5QLkVjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sYWM6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sa2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGZoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5pcDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPQoicmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLmRkO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF2LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2MuaWQ9dGhpcy5tZTtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnp2LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTsKZi5pZD10aGlzLk9nO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLm0uRWUmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz0KdGhpcy5kYS5hcHBlbmRDaGlsZChhKTt0aGlzLmYudS52YSYmdGhpcy5mLnUudmEoKSYmdGhpcy5wZygpO3RoaXMuYmMoKX19LGJjOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbGQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sQXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTt0aGlzLmYuQy5wYXVzZWQ/KHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSk6KHRoaXMuZi5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQoay5mZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTsKdGhpcy5mLkMucGF1c2VkfHwodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmZmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSx3dTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZCYmKHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LHp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tZSk7dGhpcy5mLkMubXV0ZWQ/KHRoaXMuZi5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOgoodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxwZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWUpO3RoaXMuZi5DLm11dGVkfHwodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxGYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5GYik7dGhpcy5NY3x8dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LApMZDpmdW5jdGlvbigpe3RoaXMuTWM9ITA7dGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5IYSYmdGhpcy55Y3x8InBvc3Ryb2xsIj09ZS5IYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuZi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmYubGMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpOwpiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTWQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5NZCgpfWVsc2UgdGhpcy5NZCgpfSxNZDpmdW5jdGlvbigpe3RoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5mLnh1KCk7dGhpcy5EYj0hMTtlLkQoay5ocCx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMuVGQoKS5FZygpfSxUZDpmdW5jdGlvbigpe3ZhciBhPQpudWxsO3RoaXMuZiYmdGhpcy5mLnUmJihhPXRoaXMuZi51KTtyZXR1cm4gYX0sJGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxsZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLmJnKHRoaXMudmlkZW8sYSk/dGhpcy53dSgpOnRoaXMucWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGYoKX0uYmluZCh0aGlzKSwxMDApKX0sVDpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMubSYmKGEuY2xpY2t0aHJvdWdoPXRoaXMubS5IYywKYS5kdXJhdGlvbj10aGlzLm0uZHVyYXRpb24sYS5hZFBvZD10aGlzLm0uJGEsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSx6ZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5sanx8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbT10aGlzLmFbNl07dGhpcy5Mdj10aGlzLmFbM107dGhpcy5hcD10aGlzLmFbN107dGhpcy5VdD10aGlzLmFbM107dGhpcy5tcT10aGlzLmFbM107dGhpcy5LaD10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLmJwPWI7Yi5wcm90b3R5cGU9e2RtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbTp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHY6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5hcDp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVXQ6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1xOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2g6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLmJwfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5kbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkxhPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUWI9dGhpcy5SYj0hMTt0aGlzLlNlPSIiO3RoaXMuUmU9ITE7ZCYmZC5lbXB0eT90aGlzLnVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLnRtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLndmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS50Zih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5wZChhKSkrIiZ0eXBlPWpzIiwKYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy50cy5iaW5kKHRoaXMpLHRoaXMucXMuYmluZCh0aGlzKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09CmUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5MYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYKInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6LTF9KTtyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3RoaXMubXUoYSk7dHJ5e3RoaXMuTGE9YS5yZXNwb25zZVhNTCx0aGlzLkxhfHwodGhpcy5MYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5KZigpO3RoaXMuUmI9dGhpcy5KZSgpO3RoaXMuUWI9dGhpcy5TZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnFjLHtlcnJvcjp0aGlzLlJlP0UueGQ6RS5aZX0pKX0sdXM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTGF8fCh0aGlzLkxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPXRoaXMuSmYoKTt0aGlzLlJiPXRoaXMuSmUoKTt0aGlzLlFiPXRoaXMuU2coKTt0aGlzLlcubGVuZ3RoP3RoaXMuaWMoKTp0aGlzLmdhKHRoaXMuRGEoeC5xYywKe2Vycm9yOnRoaXMuUmU/RS54ZDpFLlplfSkpfSxxczpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlllLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLldyKCk/dGhpcy5udigpPyhhKyssbmV3IGIodGhpcyx0aGlzLlNmKCksZyx7QWRTeXN0ZW06dGhpcy5xcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5hZikpOihhPTAsdGhpcy5YdigpJiZ0aGlzLnNlKHRoaXMua3AoKSkpfSxuZTpmdW5jdGlvbigpe3RoaXMuUmI/KHRoaXMuUmI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQubmUoKX0scWc6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLlFiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLmljKCkpOnRoaXMucGFyZW50LnFnKCl9LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3YoKT90aGlzLmp2KCk/ITA6KC0xIT10aGlzLiRiKCk/CnRoaXMuZ2EodGhpcy5EYSh4LlVlKSk6dGhpcy5nYSh0aGlzLkRhKHguaGkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnFjLEUuJGUpKSwhMSl9LHNlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5qZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlJiO2EuUGI9YS5QYj9hLlBiOnRoaXMuUWI7dGhpcy5wYXJlbnQuc2UoYSl9LGtwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy4kYigpO2EuTT10aGlzLk9mKCk7YS5IYz10aGlzLnRxKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5wcSgpO2EuRWU9dGhpcy5JcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguVWUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLnZxKCkpOmIuQWEuY29uY2F0KHRoaXMuQ3EoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5CYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LkJiJiYKdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0sQmY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxrdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2YoKS5sZW5ndGh9LGp2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy4kYigpfSxKZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuSmUoKSYmKGE9ITApO3JldHVybiBhfSxtdTpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuU2U9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLlJlPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFdyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5TZigpLmxlbmd0aH0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxxcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNkKHRoaXMuWiwiQWRTeXN0ZW0iKX0samU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwiRXJyb3IiXSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0KYS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx0cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxPZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLApEYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iikscng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSxwcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7CmEmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5XYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sJGI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LElxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLApkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxVZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5XYyhhKToiIn0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBVPWMudG18fFU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmtxPXRoaXMuYVs3XTt0aGlzLkNwPXRoaXMuYVs5XTt0aGlzLk1wPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HbDp0aGlzLmpxKGEpfSxqcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3E6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkNwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW46dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5odXx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkZsKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMuSGM9IiI7dGhpcy5SPXRoaXMuUGI9dGhpcy4kYT0hMTt0aGlzLm9yaWdpbj1udWxsfWMubWw9YjtiLnByb3RvdHlwZT17Y3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9CnRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBvYj1jLm1sfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMTBdO3RoaXMuVG49dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzNdO3RoaXMuZXY9dGhpcy5hWzZdO3RoaXMuams9dGhpcy5hWzVdO3RoaXMuaGo9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbNl19Yy5xbz0KYjtiLnByb3RvdHlwZT17enI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFyOnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ubjp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWk6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Mczp0aGlzLmR2KGEpfSxkdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXY6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmprOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5oajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMucW98fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLnpyKDQpOwp2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGhpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxxYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxhZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFllOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCmd4Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxVZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17WmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sJGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0saXg6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRnQ9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzhdO3RoaXMudmg9dGhpcy5hWzZdO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbN119Yy5ndD1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnQ6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZbTp0aGlzLnVoKGEpfSx1aDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmg6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlB0OnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXQ6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBzYj1jLmd0fHxzYixhZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQuRXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5PYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLlJpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5SaXx8cGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMuWGo9dGhpcy5hWzFdO3RoaXMuR3I9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuQXA9dGhpcy5hWzhdO3RoaXMueXc9dGhpcy5hWzNdO3RoaXMuZHg9dGhpcy5hWzddO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLlJvPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsyXX1jLkNpPWI7Yi5wcm90b3R5cGU9CntDaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGg6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3I6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNqOnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lajp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnl3OnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5keDp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaGw6dGhpcy5RbyhhKX0sUW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sbzp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciB0Yj1jLkNpfHx0YixiZD1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5DaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlRhPWEuS2YoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuZmc9ITE7dGhpcy5kYz1bXX1jLnNpPWI7Yi5wcm90b3R5cGU9e0dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCwKZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdxKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5QcihhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sJHU6ZnVuY3Rpb24oKXt0aGlzLmZnPSEwfSxhaDpmdW5jdGlvbigpe3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sd2c6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQoay5LYyx0aGlzLnUuQigpKX0seHU6ZnVuY3Rpb24oKXt0aGlzLmZnfHwodGhpcy51LnBsYXkoKSxlLkQoay5MYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYKKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5UYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlRhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuVGEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5HYiYmdGhpcy51LkdiKCk/dGhpcy51LktmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2MuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LFByOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGNjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudXEodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHwKYi5wb3NpdGlvbiE9dGhpcy5VYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5VYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuVWEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuVWEud2lkdGgmJjA8dGhpcy5VYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLldkKCk7cmV0dXJufXRoaXMuVWE9Yjt0aGlzLnUuR2IoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5jYy5iaW5kKHRoaXMpLDEwKX0sdG46ZnVuY3Rpb24oYSl7dGhpcy5kY3x8KHRoaXMuZGM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmRjLnB1c2goYSl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zaXx8TyxDPVtdLHViPTA7MTAwPnViO3ViKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixCKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdD10aGlzLmFbN107dGhpcy5Haz10aGlzLmFbNF07dGhpcy53dj10aGlzLmFbMl07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbNV19Yy56dD1iO2IucHJvdG90eXBlPXtDdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRHQ6dGhpcy5GayhhKX0sRms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdrOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Y6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkttOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6CnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgdmI9Yy56dHx8dmIsY2Q9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2QuQ3QoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuUyhhKTt0aGlzLkRlKGIpO3RoaXMueGYoKX0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5FYSgpLGE9dGhpcy52aWRlb1RhZzthfHwKKChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlUoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhmKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LCRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkVhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgd2I9Yy5aa3x8d2I7KGZ1bmN0aW9uKGMpe2MuWWs9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy55Yj10aGlzLnlifHwhMTt0aGlzLmVmPXRoaXMuaGY9dGhpcy5YZj10aGlzLmphPXRoaXMuTWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5mcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELAoiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk1lPSEwO3RoaXMuWGYmJnRoaXMucWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLkRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLlhmPSEwO3RoaXMucWYoKX0uYmluZCh0aGlzKSk7dGhpcy5tZigpfSxxZjpmdW5jdGlvbigpe2lmKCF0aGlzLnliKXt0aGlzLkZjKCk7aWYoIXRoaXMuTWUmJiF0aGlzLkZjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5NZSYmdGhpcy5lZiYmIXRoaXMuaGYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLAoxMDApfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LFBmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LG1mOmZ1bmN0aW9uKCl7aWYodGhpcy5GYygpKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuaGY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5lZj1iLm54fXRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1mKCl9LmJpbmQodGhpcyksMTAwKX0sdXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh4KCk6ITF9LCRiOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi4kYigpOi0xfSxEcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxmcTpmdW5jdGlvbihiLGEpe3RoaXMueWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy55Ynx8MzAyPT10aGlzLnliP3RoaXMuamE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnliKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfSxKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT8odGhpcy5vKCksdGhpcy5uYSgpKTpiLiRjKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLkRxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHhiPWMuWWt8fHhiOyhmdW5jdGlvbihjKXtjLiRrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sVXI6ZnVuY3Rpb24oKXt3aW5kb3cuT08ucWwuYW4uWm0/d2luZG93Lk9PLnFsLmFuLlptLmx4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVyKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLnhhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRmEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyB3YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgeGIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHliPWMuJGt8fHliLHpiPW5ldyB5YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbNV07dGhpcy5YbD10aGlzLmFbNF07dGhpcy5ieD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs4XX1jLllxPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhsOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ieDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6CnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NaDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuWXF8fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlhyKDQpOyhmdW5jdGlvbihjKXtjLk5sPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEdiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5ObHx8VjsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LkRkKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS5EZCgiIyIrYiwiYWRzTWFuYWdlckxvYWRGYWlsIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksCjFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5kdChhKX0uYmluZCh0aGlzKSk7eS5VcSgpfSxkdDpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufX10aGlzLmwoImFkZXJyb3IiLGEpO3RoaXMudygpfX0pfSkoYyk7dmFyIFc9Yy5NbHx8VzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUud3AoYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuSChkKSl7dGhpcy5KKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5BKTtmLmIoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxoPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5jZHx8Cih0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxvdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLmhjfHwodGhpcy5oYz1bXSksdGhpcy5oYy5wdXNoKGIpLHRoaXMudnUoKSYmKHRoaXMuRmcoKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LFVxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkub3YoYil9fSl9KShjKTt2YXIgQmI9Yy5PbHx8QmIseT1uZXcgQmIocSk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHQ9dGhpcy5hWzFdO3RoaXMuYW09dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzNdO3RoaXMuZnQ9dGhpcy5hWzJdO3RoaXMuZm89dGhpcy5hWzddO3RoaXMuR209dGhpcy5hWzVdO3RoaXMueGw9dGhpcy5hWzNdO3RoaXMuemw9dGhpcy5hWzRdO3RoaXMuYnI9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbNV19Yy5wdj1iO2IucHJvdG90eXBlPXtLdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTHQ6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XbTp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnQ6dGhpcy5lbyhhKX0sZW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mbzp0aGlzLkZtKGEpfSxGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206CnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bDp0aGlzLnlsKGEpfSx5bDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuemw6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJyOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5wdnx8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuV2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLldofHxEYjsoZnVuY3Rpb24oYyl7Yy5YaD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuYXV8fCh0aGlzLmF1PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlhofHwKRWI7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRmI9Yy5ZaHx8RmIsR2I9bmV3IEZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNpPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsyXTt0aGlzLnFyPXRoaXMuYVs5XTt0aGlzLkZzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzZdfWMuTG49YjtiLnByb3RvdHlwZT17Ymk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNpOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucXI6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5Mbnx8SGIsZmQ9bmV3IEhiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLmJpKDQpOyhmdW5jdGlvbihjKXtjLnltPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMueW18fEliOyhmdW5jdGlvbihjKXtjLnhtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMua2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLm9xfHwodGhpcy5ZZigpLAp0aGlzLm9xPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm8oKTp0aGlzLmtmPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMucygpKToodGhpcy5rZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sWWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnJxKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZZigpfS5iaW5kKHRoaXMpLDUwKX0sRng6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueG18fEpiOyhmdW5jdGlvbihjKXtjLnptPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEtiPWMuem18fEtiLExiPW5ldyBLYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Faz10aGlzLmFbOV07dGhpcy5Sdj10aGlzLmFbMTBdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMudXY9dGhpcy5hWzVdO3RoaXMub3Q9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbNl19Yy5Xbz1iO2IucHJvdG90eXBlPXtEazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWs6dGhpcy5RdihhKX0sUXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sdjp0aGlzLmttKGEpfSxrbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG06dGhpcy50dihhKX0sdHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnV2OnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciBNYj1jLldvfHxNYixnZD1uZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1nZC5Eayg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpOwpiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgTmI9Yy5aanx8TmI7KGZ1bmN0aW9uKGMpe2MuWWo9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuamgoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLkdmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLApmdW5jdGlvbigpe3RoaXMuR2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMucW4oKX0uYmluZCh0aGlzKSksdGhpcy5raD0hMSx0aGlzLnd3PTFFMyx0aGlzLnlnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxHZjpmdW5jdGlvbigpe3RoaXMueWcuZG9uZXx8KHRoaXMueWcuZG9uZT0hMCx0aGlzLmtoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qaCgpfS5iaW5kKHRoaXMpLHRoaXMud3cpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2gpO3RoaXMubygpfSxqaDpmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sTWY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHdhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5NZihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLk1mKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLllqfHxPYjsoZnVuY3Rpb24oYyl7Yy4kaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmCndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBQYj1jLiRqfHxQYixRYj1uZXcgUGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLkhzPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVs4XTt0aGlzLlZ1PXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzRdfWMuJHA9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZHI6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZ1OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgUmI9Yy4kcHx8UmIsaGQ9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLlR3KDQpOyhmdW5jdGlvbihjKXtjLklsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBTYj1jLklsfHxTYjsoZnVuY3Rpb24oYyl7Yy5IbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLAphKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpO3RoaXMuVmIoKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5jZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwKMTApfSxjZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgVGI9Yy5IbHx8VGI7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJgohd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLkpsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzRdO3RoaXMudnc9dGhpcy5hWzEwXTt0aGlzLkNrPXRoaXMuYVs0XTt0aGlzLlFrPXRoaXMuYVs2XTt0aGlzLlZoPXRoaXMuYVsyXTt0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLlhuPXRoaXMuYVsyXTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzVdfWMuZmo9YjtiLnByb3RvdHlwZT17VW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQ246dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZ3OnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dazp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWs6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZoOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5XbihhKX0sV246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhuOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMuZmp8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PQppZC5Vbyg0KTsoZnVuY3Rpb24oYyl7Yy5CbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuUyhiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy50ZT0hMX0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZHUoKX0uYmluZCh0aGlzKSw1MDApfSxkdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7CnJldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy50ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50ZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFh1OmZ1bmN0aW9uKCl7dGhpcy50ZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBYYj1jLkJsfHxYYjsoZnVuY3Rpb24oYyl7Yy5BbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuTmI9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk5ifHwodGhpcy5OYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsCiJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk5ifHx0aGlzLk5iKyssdGhpcy5OYjw9dGhpcy5Kcz8odGhpcy5OYisrLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSl9LHM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlh1KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBZYj1jLkFsfHxZYjsoZnVuY3Rpb24oYyl7Yy5DbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSwKdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWWIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBaYj1jLkNsfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUWk9dGhpcy5hWzNdO3RoaXMuQmg9dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVs5XTt0aGlzLlBuPXRoaXMuYVszXTt0aGlzLnVyPXRoaXMuYVs0XTt0aGlzLlpsPXRoaXMuYVsxXTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVs0XX1jLm9tPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RaTp0aGlzLkFoKGEpfSxBaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQmg6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRoOnRoaXMuUXUoYSl9LApRdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnU6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBuOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51cjp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWmw6dGhpcy5IcChhKX0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLklwOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIGFjPWMub218fGFjLGpkPW5ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLlBpKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT0KdGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBiYz1jLnNsfHxiYzsoZnVuY3Rpb24oYyl7Yy5ybD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBiKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuZXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuVmMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm1zKCk6dGhpcy5WYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZigpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5kZigpfHx0aGlzLnMoITApfSxtczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmMoKTshYi5tYSYmYi5XJiZiLmt4JiZiLm14JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlZjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwxMDApfSxWYzpmdW5jdGlvbigpe2lmKCF0aGlzLnVnKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy51Zz1iW2NdKTtyZXR1cm4gdGhpcy51Z30sY2U6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuVmMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKToKdGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNjPWMucmx8fGNjOyhmdW5jdGlvbihjKXtjLnRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGJjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBjYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBkYz1jLnRsfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmNtPXRoaXMuYVsxMF07dGhpcy51bz10aGlzLmFbOV07dGhpcy5CdD10aGlzLmFbN107dGhpcy5jbz10aGlzLmFbNV07dGhpcy5Haj10aGlzLmFbMTBdO3RoaXMucmg9dGhpcy5hWzVdO3RoaXMuY3M9dGhpcy5hWzFdO3RoaXMuaXE9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbMl19Yy5Fcj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY206dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVvOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CdDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucmg6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNzOnRoaXMuaHEoYSl9LApocTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaXE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLkVyfHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5ibSg0KTsoZnVuY3Rpb24oYyl7Yy5xaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hPwp0aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7CmIhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5xa3x8WDsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy52ZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnZlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMudmUmJmIhPXRoaXMudmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5KeCksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLnBrfHxZOyhmdW5jdGlvbihjKXtjLnJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFkoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5GZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLnJrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuS3UoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUua2cuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlsW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLmtnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVHA9dGhpcy5hWzZdO3RoaXMuT209dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzZdO3RoaXMuaT10aGlzLmFbOF19Yy5haj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5ObShhKX0sTm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5PbTp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYz1jLmFqfHxpYyxsZD1uZXcgaWMoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bGQuU3AoNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlMoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5Tcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX0sCkN1OmZ1bmN0aW9uKGIpe3RoaXMuQmQ9Yn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Tc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkJkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5CZCYmKG5ldyBJKHRoaXMsdGhpcy5CZCkpLmIoKSl9fSl9KShjKTt2YXIgTj1jLmdtfHxOOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5SZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuTXUoKTp0aGlzLnMoITApLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlJkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSwKWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuZm18fEk7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuQ3UodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuaG18fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51dD0KdGhpcy5hWzVdO3RoaXMuYXQ9dGhpcy5hWzVdO3RoaXMuenM9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbOV19Yy5Saz1iO2IucHJvdG90eXBlPXt0dDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF0OnRoaXMueXMoYSl9LHlzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56czp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYz1jLlJrfHxsYyxtZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC50dCg0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy51Zj0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmVhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51Zn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3pvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMudWY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCnt6bzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIG1jPWMubmt8fG1jOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE54OmZ1bmN0aW9uKCl7fSxxdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLlRlKG5ldyBmdW5jdGlvbigpe30pO2EuaHg9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IucXUoYSk7d2luZG93LnB4PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLnB1fHwodGhpcy5wdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLllkfHwodGhpcy5ZZD0xKTtpZigyMDx0aGlzLllkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkthKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuWWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEthOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5BZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSl9LFg6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBuYz1jLm1rfHxuYzsoZnVuY3Rpb24oYyl7Yy5vaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbWMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmthfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBuYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgb2M9Yy5va3x8b2MscGM9bmV3IG9jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sbj10aGlzLmFbMV07dGhpcy5Odz10aGlzLmFbN107dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5PcT10aGlzLmFbMV07dGhpcy5Zbz10aGlzLmFbNV07dGhpcy5hcz10aGlzLmFbM107dGhpcy53az10aGlzLmFbNl07dGhpcy5qbD10aGlzLmFbM107dGhpcy5Vdj10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVsxMF19Yy5OcD1iO2IucHJvdG90eXBlPXtRbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJuOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnc6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklrOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PcTp0aGlzLlhvKGEpfSxYbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW86dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFzOgp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLlR2KGEpfSxUdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVXY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBxYz1jLk5wfHxxYyxuZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Rbig0KTsoZnVuY3Rpb24oYyl7Yy5kaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVShhKTthJiZ0aGlzLlMoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLmRrfHxaOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlVmPTA7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPXRoaXMuZWM9dGhpcy5YYT10aGlzLkJjPSExO3RoaXMuQ2c9ZS5uYigxMCk7dGhpcy5jZygpfSxjZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT0KYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkthKCksITA7dGhpcy5VZisrO2lmKDEwPHRoaXMuVWYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLDEwMCksITF9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiYKZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PQphLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7CmJyZWFrfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuY2t8fGFhOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0KMDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIHJjPWMuZWt8fHJjLHNjPW5ldyByYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbMl07dGhpcy50aj10aGlzLmFbNl07dGhpcy5Qdz10aGlzLmFbN107dGhpcy5GaD10aGlzLmFbMTBdO3RoaXMuSWg9dGhpcy5hWzRdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMud2k9CnRoaXMuYVsxMF07dGhpcy5TbT10aGlzLmFbOV07dGhpcy5tdD10aGlzLmFbM107dGhpcy5Scz10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbMl19Yy52dD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXI6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMuT3coYSl9LE93OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qdzp0aGlzLkVoKGEpfSxFaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZoOnRoaXMuSGgoYSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaDp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndpOnRoaXMuUm0oYSl9LFJtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TbTp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXQ6CnRoaXMuUXMoYSl9LFFzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRjPWMudnR8fHRjLG9kPW5ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLmxyKDQpOyhmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSwkYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdWM9Yy5UaXx8dWM7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLApmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5zKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgdmM9Yy5TaXx8dmM7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB1YyhkKSxkLmthfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB2YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciB3Yz1jLlVpfHx3Yyx4Yz1uZXcgd2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuam09dGhpcy5hWzNdO3RoaXMuTm49CnRoaXMuYVs3XTt0aGlzLnl0PXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVs4XTt0aGlzLnpoPXRoaXMuYVs3XTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLmhrPXRoaXMuYVs5XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmFvPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMucm89YjtiLnByb3RvdHlwZT17aW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmptOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueXQ6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMueWgoYSl9LHloOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aDp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSXI6dGhpcy5nayhhKX0sZ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhrOnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubmk6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgeWM9Yy5yb3x8eWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuaW0oNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHpjPWMuWGl8fHpjOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLm9mKCl9LG9mOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5XaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyB6Yyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5rYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkgoYikpe3RoaXMuSihiKTsobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5ZaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkduPXRoaXMuYVs5XTt0aGlzLmx1PXRoaXMuYVs0XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLklpPXRoaXMuYVsxMF07dGhpcy52aj10aGlzLmFbOF07dGhpcy5rcj10aGlzLmFbMV07dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Saj10aGlzLmFbOF07dGhpcy5NaT10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs2XX1jLnlwPWI7Yi5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuR246dGhpcy5rdShhKX0sa3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmx1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSWk6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3I6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNyOnRoaXMuUWooYSl9LFFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Sajp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRGM9Yy55cHx8RGMscWQ9bmV3IERjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLkZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmVnPXRoaXMuaGc9dGhpcy5nZz0hMTt0aGlzLmVkPVtdO3RoaXMueWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIENjP251bGw6Q2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHNjP251bGw6c2MsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFVhP251bGw6VWEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBaYT9udWxsOlphLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOgplYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgaGM/bnVsbDpoYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgR2I/bnVsbDpHYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yz9udWxsOnhjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaWI/bnVsbDppYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBQYT9udWxsOlBhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFhP251bGw6cWF9fWMub2w9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5GcShhKTpbXSxiO3RoaXMuaGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2c9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuR2coYil9ZWxzZSBmb3IoYyBpbiB0aGlzLnllKXtpZih0aGlzLmVnKWJyZWFrO2I9dGhpcy55ZVtjXTt0aGlzLk9lKGIpJiYodGhpcy5lZC5wdXNoKGIpLHRoaXMuR2coYikpfX0sT2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxGcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjOwppZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMueWVbY10sdGhpcy5PZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxHZzpmdW5jdGlvbihhKXt0aGlzLk9lKGEpJiZhLmIoKX0sWnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdnKWZvcih0aGlzLmVnPSEwLGE9MDthPHRoaXMuZWQubGVuZ3RoO2ErKyl0aGlzLmVkW2FdLnRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWRbYV0udGIpfX19KShjKTt2YXIgRWM9Yy5vbHx8RWMsTD1uZXcgRWM7TC5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzFdO3RoaXMuUnQ9dGhpcy5hWzRdO3RoaXMuZ3I9dGhpcy5hWzVdO3RoaXMuTnQ9dGhpcy5hWzldO3RoaXMuYWk9dGhpcy5hWzNdO3RoaXMuYms9dGhpcy5hWzEwXTsKdGhpcy5CdT10aGlzLmFbNF07dGhpcy55cj10aGlzLmFbOV07dGhpcy5PaD10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVs5XX1jLmJuPWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5naTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5OdDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWk6dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJrOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CdTp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueXI6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9oOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEZjPWMuYm58fEZjLHJkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLmZpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlpiKGsuWXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5aYihrLlZzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ry53aWR0aD0xO0cuaGVpZ2h0PTE7Ry5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEcpO3ZhciBzZD1HLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5mYygpO0guWmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5aZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csCkguSnIoKSx7aWQ6dGR9KX0sNTAwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZ4PXRoaXMuYVsyXTt0aGlzLkV3PXRoaXMuYVsxXTt0aGlzLm9zPXRoaXMuYVs5XTt0aGlzLk9pPXRoaXMuYVs1XTt0aGlzLlhwPXRoaXMuYVs5XTt0aGlzLlpuPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzEwXX1jLlN3PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5meDp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXc6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9zOnRoaXMuTmkoYSl9LE5pOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PaTp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5abjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIEdjPWMuU3d8fEdjLHVkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLmV4KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5BZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuYWQ9MDt0aGlzLk5hPSIiO3RoaXMuZmQ9W107dGhpcy5nZD0wO3RoaXMuQmc9ITE7dGhpcy53ZT1bXX1jLm9oPWI7Yi5wcm90b3R5cGU9e0p1OmZ1bmN0aW9uKGEpe3RoaXMuQWc9YX0samQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFdTpmdW5jdGlvbihhKXt0aGlzLldhPWF9LER1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxrYzpmdW5jdGlvbihhLGIpe2UuamIoIndlbHQuZGUiKSYmZS5NYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5XYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLk5yKCkpdGhpcy5XYS5jKHRoaXMuV2EuWGMsdGhpcy5XYS5CYSx0aGlzLldhLnhlLGZ1bmN0aW9uKCl7dGhpcy5rYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLldhLk5jKTtlbHNlIGlmKHRoaXMuV3EoKSl0aGlzLnp1KGZ1bmN0aW9uKCl7dGhpcy5rYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuJHUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLkpnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklzKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5lZSYmKGM9dGhpcy5wbGF5ZXIuZWUoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZ2UoYSwKYyxmKTt0aGlzLnBsYXllci5LZyhsKX19LE5yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuYWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5hZC5nZXRUaW1lKCksdGhpcy5hZD1hLDNFNTxiPyEwOiExO3RoaXMuYWQ9YTtyZXR1cm4hMX0sVHU6ZnVuY3Rpb24oKXtlLkNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQ2YoYSkpP3RoaXMua2MoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGsuTGMsdGhpcy5wbGF5ZXIuQigpKSl9LFN1OmZ1bmN0aW9uKGEpe2UuQ2UoInBvc3Ryb2xsIik7aWYoIXRoaXMuQWcpe3RoaXMuSnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLkNmKGMpKT90aGlzLmtjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5MYyx0aGlzLnBsYXllci5CKCkpKX19LENmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxzdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk91KHRoaXMuU3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZmEoKX0sbWQ6ZnVuY3Rpb24oYSl7ZS5DZSgibWlkcm9sbCIpO2lmKCF0aGlzLm1nKXt0aGlzLm1nPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmtjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChrLkxjLHRoaXMucGxheWVyLkIoKSkpfX0scnU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5JdSh0aGlzLm1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmtlKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlR1KCk7dGhpcy5wbGF5ZXIua2UmJnRoaXMucnUoKTt0aGlzLnN1KCl9LHR1OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuZmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLlZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5nZD10aGlzLmZkLmxlbmd0aH0sV3E6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLmdkJiYoYT0hMCk7cmV0dXJuIGF9LHp1OmZ1bmN0aW9uKGEpe3RoaXMuQmc9YTtmb3IoYT0wO2E8dGhpcy5mZC5sZW5ndGg7YSsrKXRoaXMuZmRbYV1bImZ1bmN0aW9uIl0odGhpcy5ndS5iaW5kKHRoaXMpKX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5nZC0tO2EmJnRoaXMud2UucHVzaChhKTswPj10aGlzLmdkJiZ0aGlzLkJnKCl9LElzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLndlLmxlbmd0aDtjKyspYj10aGlzLndlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBoYT1jLm9ofHxoYSxTPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxMF07dGhpcy5saT10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVszXX1jLmZrPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLk52OnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5saTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZmt8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLk12KDQpfSkuY2FsbChhaXRoYWlOZ0llYmVpbG9vLGFpdGhhaU5nSWViZWlsb28pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.214.67 Wilmington, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-214-67.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
45a04c7005bb41f2314b6009e60eac10dd0391def8420cac4401442355e09c82

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
Tue, 27 Nov 2018 09:04:13 GMT
Via
1.1 d7524ff4a82155dd51a24800cf39deec.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
5
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
313
Last-Modified
Tue, 27 Nov 2018 09:03:20 GMT
Server
AmazonS3
ETag
"55bcf02ab6886a2e1347ccbc31cbb561"
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
68PEJPv7aNRa4pU611vN3fLsd5FW9zG1-rj2IdH6jYfmiMiEPoxdyg==
Expires
0
/
ssl.1.damoh.golem.de/b82ef4ce3ada64f9af0b64a5fe77cee690a702cf/
313 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/b82ef4ce3ada64f9af0b64a5fe77cee690a702cf/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpdGhhaU5nSWViZWlsb289YWl0aGFpTmdJZWJlaWxvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kucGV8fCh5LnBlPTApO3kucGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5wZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk1hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5KZyhsKSxhLmdlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLnhvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLktjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuRXUobSk7YS5EdShsKTthLnR1KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubGs9dGhpcy5hWzldO3RoaXMuSnY9CnRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLkxsPXRoaXMuYVsxXTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLm1wPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuU3Y9YjtiLnByb3RvdHlwZT17a2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxrOnRoaXMuSXYoYSl9LEl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kdjp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG86dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5idihhKX0sYnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmN2OnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5tcDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgaWE9Yy5Tdnx8aWEsSWM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SWMua2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueG89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5yZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmZ1LmJpbmQodGhpcykpfWMubmo9YjtiLnByb3RvdHlwZT17cmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sem46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0sCnBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LHphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxmdTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5ldShhLmRhdGEpfSxldTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsCmNiOmJ9KX0sdGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55cShhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuamcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx5cTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYKKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0seG46ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLm5xKGEpKXJldHVybjsoYj10aGlzLnRmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxucTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxFZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LExmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxZdTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKYWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxiZzpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXQpcmV0dXJuITE7Yz10LmhlaWdodCp0LndpZHRoO2Q9dC53aWR0aDtmPXQuaGVpZ2h0OwowPnQudG9wJiYoZis9dC50b3ApO3QuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dC5sZWZ0JiYoZCs9dC5sZWZ0KTt0LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXQucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrCi4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxWZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHQ9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsCm09MzI4NTM3NzUyMCxuLGssdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPApwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXQ7az1BO3c9bDtxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmCjQyOTQ5NjcyOTU7dD10K24mNDI5NDk2NzI5NTtBPUErayY0Mjk0OTY3Mjk1O2w9bCt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHQpK2IoQSkrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHQsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix0PWMmNjMsaXNOYU4oZik/ZT10PTY0OmlzTmFOKGMpJiYodD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh0KTtyZXR1cm4gYn0sVHI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx3ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHQ9ITEsQT0hMSxrPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuc28/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxBPSF0JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KGt8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXQ7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWs7YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy53ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJgooYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtHaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxaaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxlcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxCbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sb286ZnVuY3Rpb24oKXtyZXR1cm4gYS5HaCgpfHxhLlpoKCl8fGEuZXIoKXx8YS5hbCgpfHxhLkJtKCl9fTtyZXR1cm4gYS5vbygpfSwKSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp7fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRZjpmdW5jdGlvbihhKXthPXRoaXMuSmEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxqYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHdwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LFd1OmZ1bmN0aW9uKGEsCmIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LElmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy4kZyhiKSsiOiIrdGhpcy4kZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LENlOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYiwKe2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxaYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5SYyhiLGQpKTtiJiYoaD1rLlJjKGEsYikpO2YmJihoPWsuUmMoaCxmKSk7YyYmKGg9ay5SYyhoLGMpKTtlLlpiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLm5jfHwodGhpcy5uYz17fSk7dGhpcy5uY1tmXXx8Cih0aGlzLm5jW2ZdPTApO3RoaXMubmNbZl0rKzsxMDx0aGlzLm5jW2ZdfHwoZj1tLnplKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxtLkdhKGYsITApLGY9bS5HYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixtLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxoZTpmdW5jdGlvbigpe20mJm0uYWE/bS5pc0VuYWJsZWQmJm0uTG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSw1MDApfSxTZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLldjKGEpOiIifSxXYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlVkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sCnlvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuYWUoYSl8fHRoaXMuVnIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LkhnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuRWYoYSkpcmV0dXJuIHRoaXMuRWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk1hKGEsYi51YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5aYygpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy54bihjLGEpO3JldHVybiBjfSxNYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHQpe3ZhciBrPWh8fG07aD0hMDt0JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suR2EoYSxoKTtoPWsuR2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT0KZFtxXTtyZXR1cm4gay5JYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoYSxiLGQsZixjLGssZSx0KX0uYmluZCh0aGlzKSw1MDApfSxqZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdD0hMDtlJiYodD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHQpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sc3M6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMubWMpZm9yKHZhciBjIGluIHRoaXMubWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5tY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuemIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxrZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKYy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnNzKGYuWmMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1jPWF9LFZ3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5NYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIiwKZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxwbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLAphPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFJyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLm5qfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5zeD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1qPWI7Yi5SYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuU3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHc9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07CmIuYXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnBuPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLmhuPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5sbj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ybj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuZ249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Iuam49e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlRzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmJxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Bdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5abz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLmhwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5MYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5LYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Iubm49e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLm1uPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5nZj17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuZmY9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Iuc249e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmtuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5Zdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Wcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMubWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzddO3RoaXMud3I9dGhpcy5hWzNdO3RoaXMudGg9dGhpcy5hWzRdO3RoaXMuUHM9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbMTBdfWMueGk9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLndyOnRoaXMuc2goYSl9LHNoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy50aDp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBqYT1jLnhpfHxqYSxKYz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1KYy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLm9qPWI7Yi5wcm90b3R5cGU9e1ZkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4Iil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFNjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5TYyhhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5TYyhNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGZjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVmQodGhpcy5mYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLlNjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxKcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZjKCkrIjIifSxaZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlZkKHRoaXMuQnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5TYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMub2p8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzEwXTt0aGlzLktrPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNl07dGhpcy5WcD10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs1XX1jLk1yPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eczp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2s6dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcDp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkJzOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIGthPWMuTXJ8fGthLEtjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLkNzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5UZT1ifSkoYyk7dmFyIEs9Yy5UZXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mbj10aGlzLmFbNV07dGhpcy5Waj10aGlzLmFbNl07dGhpcy5NbT10aGlzLmFbNV07dGhpcy5rbz10aGlzLmFbMl07dGhpcy5ZdD10aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbOF07dGhpcy5laj10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs2XX1jLnp3PWI7Yi5wcm90b3R5cGU9e2VuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5mbjp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlZqOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NbTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLll0OnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWo6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYT1jLnp3fHxsYSxMYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5lbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLm5sPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueWE9e307dGhpcy5BPW51bGw7dGhpcy5qYz0KMTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy5GdShiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKTowPnRoaXMueGEmJih0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYj50aGlzLnhhPyEwOiExfSxGZzpmdW5jdGlvbigpe3RoaXMub2I9MH0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZ1OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxBcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmZiKCldPWI7TCYmTC5oZyYmTC5adShiKX0sQXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5GYSh0aGlzLnlhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy55YSlpZihhPT0KdGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxTcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LE94OmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMubmx8fHI7KGZ1bmN0aW9uKGMpe2MucGw9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5qYz0xMDt0aGlzLm9iPTA7dGhpcy54YT01MDt0aGlzLks9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWI7dGhpcy5oYj0iIjt0aGlzLnlmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz0KYSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxPdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxJdTpmdW5jdGlvbihiKXt0aGlzLmxlPWJ9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV9LGtlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5vYjw9dGhpcy54YSYmKHRoaXMub2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmpjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxLZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxQeDpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5YcSgpfHx0aGlzLnVuKCk7dGhpcy5EZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHVuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLnBhKDEwKSl9LFhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LCRjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmthPSEwfSxHYjpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS2c6ZnVuY3Rpb24oYil7dGhpcy5oYj1ifSx5eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhifSxFZzpmdW5jdGlvbigpe3RoaXMuaGI9bnVsbH0sRXg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmhiJiYoYj0hMCk7cmV0dXJuIGJ9LEt4OmZ1bmN0aW9uKCl7dGhpcy55Znx8KHRoaXMueWY9ITApfSxUYzpmdW5jdGlvbigpe3JldHVybiExfSwKdng6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMucGx8fHA7KGZ1bmN0aW9uKGMpe2MucGg9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLkE9dGhpcy5wbGF5ZXI9IiI7dGhpcy5iZj0iMSI7dGhpcy5jZj0iMiI7dGhpcy4kbT0iMyI7dGhpcy5zYz0wO3RoaXMubmc9MzA7dGhpcy54Yj1bXTt0aGlzLlJhPVtdO3RoaXMuT2I9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuamY9dGhpcy5kaD0hMTt0aGlzLnN0YXR1cz10aGlzLnNjO3RoaXMuaWQ9ZS5wYSgxMCk7dGhpcy5qZChiKTt0aGlzLkd1KGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuZGh8fCh0aGlzLmRoPSEwLGUuaGUoKSl9LG9lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaWEoKT8hMToodGhpcy5MdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuV2coKSx0aGlzLmpmPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxsOmZ1bmN0aW9uKGIsYSl7dGhpcy5pYSgpfHwodGhpcy54Yi5wdXNoKGIpLHRoaXMuUmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy54YiYmMDx0aGlzLnhiLmxlbmd0aCYmKHRoaXMueGI9ZS51bmlxdWUodGhpcy54YiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMueGIuam9pbigiLCIpKSk7aWYodGhpcy5SYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlJhLmxlbmd0aDtnKyspdGhpcy5PYlt0aGlzLlJhW2ddLnJlYXNvbl09PQp0aGlzLk9iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuT2JbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuT2JbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksYj10aGlzLlJhW2ddLnJlYXNvbik7dGhpcy5PYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LER4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamZ9LG86ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJmfSxMdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuY2Z9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kbX0scGI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnNjfSxkZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5iZn0sang6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuY2Z9LAppYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5zY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sQXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSx2czpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMucGh8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Y9dGhpcy5hWzZdO3RoaXMuSnQ9dGhpcy5hWzldO3RoaXMuTWs9dGhpcy5hWzNdO3RoaXMubGw9dGhpcy5hWzJdO3RoaXMuemo9dGhpcy5hWzEwXTt0aGlzLml0PXRoaXMuYVs1XTt0aGlzLlZsPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs0XTt0aGlzLlRsPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzEwXX1jLnd0PWI7Yi5wcm90b3R5cGU9e1Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuV3Y6dGhpcy5JdChhKX0sSXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkp0OnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Nazp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpqOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pdDp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVmw6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9wOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5UbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIG5hPWMud3R8fG5hLE1jPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Wdig0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpOwp2YXIgVD1jLnBpfHxUOyhmdW5jdGlvbihjKXtjLm9pPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy52ZD1udWxsO3RoaXMuZHc9MUUzO3RoaXMueGc9bnVsbDt0aGlzLnh2PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5zbyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLmdxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5UcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLlNxKGEsYil9LmJpbmQodGhpcykpO2IudnBFdmVudCYmKGIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5ndyhiKX0uYmluZCh0aGlzKSksYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuaHcoYil9LmJpbmQodGhpcykpKTsKYi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuUnEoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLmZwKGEpfS5iaW5kKHRoaXMpKX0sZnA6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxndzpmdW5jdGlvbihiKXt0aGlzLnZkfHwodGhpcy52ZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaXcoYil9LmJpbmQodGhpcyksdGhpcy5kdykpfSxpdzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCk7dGhpcy53KCl9LGh3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZkKX0sUnE6ZnVuY3Rpb24oYil7dGhpcy5xeChiKTt0aGlzLnhnPW5ldyBEYXRlO3RoaXMueGctdGhpcy5idTx0aGlzLnh2P3RoaXMudygpOnRoaXMubygpfSxUcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmpkKG5ldyBUKGEpKSk7CnRoaXMudygpfSxncTpmdW5jdGlvbigpe30sU3E6ZnVuY3Rpb24oKXt0aGlzLmJ1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIG9hPWMub2l8fG9hOyhmdW5jdGlvbihjKXtjLnJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuRmEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyBvYShnLHRoaXMuQSkpLmIoKSl9fXRoaXMuSSgpfX19KX0pKGMpO3ZhciBwYT1jLnJpfHxwYSxxYT1uZXcgcGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnA9dGhpcy5hWzhdO3RoaXMuaT0KdGhpcy5hWzFdfWMuZmw9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnZwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcmE9Yy5mbHx8cmEsTmM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudXAoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt0aGlzLkRmKCk7dGhpcy5GZigpO3RoaXMuZ3A9ITF9LERmOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuRWI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlOwp0aGlzLlMoYil9LEZmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3ZhciBiPXRoaXMuRWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkViPSEwKTt0aGlzLlUoYSl9fSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmCigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKSl9LGtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMubWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpKX0sbWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmCmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5sZSYmKDAsdGhpcy5sZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LAp2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxUYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuT2p8fHNhOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5zYzt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJgooYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMub2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm5nJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5ncD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEucWUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMub2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmcmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy53Yy5pbmRleE9mKGEpJiYKdGhpcy53Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMud2MubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LHZzOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuUGQ/dGhpcy5QZCsrOnRoaXMuUGQ9MTp0aGlzLk9kP3RoaXMuT2QrKzp0aGlzLk9kPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLll1KGEudmlkZW9UYWcpP2EuRWI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy51Y3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLk9kPnRoaXMuUGQmJihiPSExKSx0aGlzLncoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5EZigpLGEuRmYoKSxhLkVifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHRhPWMuTmp8fHRhOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuSmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5TcihnKXx8KHRoaXMuSihnKSxnPW5ldyB0YShnLHRoaXMuQSksCmcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0seHg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sd3E6ZnVuY3Rpb24oKXt2YXIgYj1lLkphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLlBqfHx1YSx2YT1uZXcgdWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3A9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuVmk9YjtiLnByb3RvdHlwZT17RnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgd2E9Yy5WaXx8d2EsT2M9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLkZwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLkRtfHx4YTsoZnVuY3Rpb24oYyl7Yy5DbT11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB5YT1jLkNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5FbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJgp3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgemE9Yy5FbXx8emEsQWE9bmV3IHphKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh2PXRoaXMuYVs1XTt0aGlzLktwPXRoaXMuYVs3XTt0aGlzLkN3PXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVsyXTt0aGlzLlpzPXRoaXMuYVs5XTsKdGhpcy5QcD10aGlzLmFbNl07dGhpcy5jdD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbMTBdO3RoaXMuUHY9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbM119Yy5HaT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHY6dGhpcy5KcChhKX0sSnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLktwOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddzp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5ZcyhhKX0sWXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpzOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QcDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3Q6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnppOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuUHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLkdpfHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5Hdig0KTsoZnVuY3Rpb24oYyl7Yy52bT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlUoYik6dGhpcy5lYSgpKTp0aGlzLmVhKCl9ZWxzZSB0aGlzLmVhKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgQ2E9Yy52bXx8Q2E7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT10aGlzLmVjPXRoaXMuWGE9dGhpcy5CYz0hMTt0aGlzLkNnPWUubmIoMTApO3RoaXMuYmg9ITA7dGhpcy5HZD10aGlzLldmPSExO3RoaXMuc2coKTt0aGlzLklvKCk7dGhpcy5LYSgpfSxMeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLHR5cGVvZiBiLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuVz9iLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkYsIjsiLHR5cGVvZiBiLkYsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5zYT9iLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLnNhP3R5cGVvZiBiLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi56ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5BZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuRmQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5GZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNnKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxVYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj10aGlzLmdiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5tYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5tYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5tYX0sTmY6ZnVuY3Rpb24oKXtpZighdGhpcy5lYyl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5lYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmVjfSwKUXI6ZnVuY3Rpb24oKXtpZighdGhpcy5WZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5PcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVmY9ITApfXJldHVybiB0aGlzLlZmfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuQmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkJjPSEwKTtyZXR1cm4gdGhpcy5CY30sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuQWUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLkdkPSEwO3ZhciBiPXRoaXMuTmYoKTtpZihifHx0aGlzLmlhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuU2I9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLlNiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5TYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuWSgpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHd4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5zZiYmYi5hZHMmJih0aGlzLnNmPWIuYWRzKTtyZXR1cm4gdGhpcy5zZn0sSW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMub2UoKX0uYmluZCh0aGlzKSl9LHZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5OZigpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmYoKX0uYmluZCh0aGlzKSw1MCl9LHNnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPApiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5RcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlVjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlVjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLmdiKCl9ZWxzZSB0aGlzLldmP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nYigpLGI9dGhpcy5VYygpO2EmJiFiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWSgpKToodGhpcy5ZKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxKbzpmdW5jdGlvbigpe3RoaXMuV2J8fCh0aGlzLldiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5XYiE9Yi5hZHMuc3RhdGUmJih0aGlzLldiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLldiKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuV2I9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpvKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITA7dGhpcy5vKCJlbXB0eSB2YXN0Iil9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLmJoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLmJoLGZ1bmN0aW9uKCl7dGhpcy52ZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxPbzpmdW5jdGlvbigpe3RoaXMuR3h8fCgxMDx0aGlzLmV3Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApKToodGhpcy5ldysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9vKCl9LmJpbmQodGhpcyksNTApKSl9LHV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5mdyl7dGhpcy5mdz0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy51bXx8RGE7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUGcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLlBnKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LFBnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTt2YXIgRWE9Yy53bXx8RWEsRmE9bmV3IEVhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl3PXRoaXMuYVs5XTt0aGlzLkN2PXRoaXMuYVs5XTt0aGlzLlhzPXRoaXMuYVs2XTt0aGlzLkh0PXRoaXMuYVs0XTt0aGlzLiR0PXRoaXMuYVs2XTt0aGlzLnhoPXRoaXMuYVs3XTt0aGlzLlh3PXRoaXMuYVs3XTt0aGlzLnNtPXRoaXMuYVszXTt0aGlzLlFtPQp0aGlzLmFbN107dGhpcy5xbT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs0XX1jLmpwPWI7Yi5wcm90b3R5cGU9e0h3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jdzp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3Y6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhzOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdDp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuJHQ6dGhpcy53aChhKX0sd2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhoOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ydzp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnFtOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgR2E9Yy5qcHx8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSHcoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksCmc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApOwpyZXR1cm4gYn0sVGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuUWx8fEhhOyhmdW5jdGlvbihjKXtjLlBsPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm9jPSExO3RoaXMuRGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5vYz0KITAsdGhpcy5vKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy5HYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLnBmKCk6dGhpcy5vKCl9LEdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm9jPSEwLHRoaXMubygpOwp0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMub2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5HYy5iaW5kKHRoaXMpLDEwMCl9fSxwZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSwKdGhpcy5vKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGYuYmluZCh0aGlzKSw1MCl9fSxEZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7CmIuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5vYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5QbHx8SWE7KGZ1bmN0aW9uKGMpe2MuUmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiYKdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuUmx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbMTBdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuRXA9dGhpcy5hWzldO3RoaXMuT2s9dGhpcy5hWzhdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuTHc9dGhpcy5hWzEwXTt0aGlzLm5oPXRoaXMuYVsyXTt0aGlzLnFwPXRoaXMuYVs2XTt0aGlzLlZuPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLkRsPWI7Yi5wcm90b3R5cGU9e1p3OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuJHc6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxzOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FcDp0aGlzLk5rKGEpfSxOazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2s6dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJpOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbjp0aGlzLkt3KGEpfSxLdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHc6dGhpcy5taChhKX0sbWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5oOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcDp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZuOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5EbHx8TGEsUmM9bmV3IExhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLlp3KDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMucmc9YX0sTjpmdW5jdGlvbigpe30saWU6ZnVuY3Rpb24oYil7dGhpcy5yZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5yZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5RaHx8TWE7KGZ1bmN0aW9uKGMpe2MuUGg9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0saWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLlBofHxOYTsoZnVuY3Rpb24oYyl7Yy5SaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuaWUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuaWUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5SaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuVms9dGhpcy5hWzEwXTt0aGlzLkhvPXRoaXMuYVs5XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLmppPXRoaXMuYVs4XTt0aGlzLkZ2PXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5zdD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs5XX1jLnl1PWI7Yi5wcm90b3R5cGU9e3dqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlVrKGEpfSxVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ibzp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSWo6dGhpcy5paShhKX0saWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmppOnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdjoKdGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFrOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54czp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3Q6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBRYT1jLnl1fHxRYSxTYz1uZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53aig0KTsoZnVuY3Rpb24oYyl7Yy50az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksCmE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLnRrfHxSYTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnZjKCl9LmJpbmQodGhpcykpLAokKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSkpOnRoaXMudmMoKX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuc2t8fFNhOyhmdW5jdGlvbihjKXtjLnVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj0KbmV3IFJhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgU2EoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRhPWMudWt8fFRhLFVhPW5ldyBUYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdz10aGlzLmFbNV07dGhpcy4kcT10aGlzLmFbMl07dGhpcy5VbT10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzRdO3RoaXMuRm89dGhpcy5hWzRdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOF19Yy5BbT1iO2IucHJvdG90eXBlPXtRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRxOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLkJqOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLkFtfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Rdyg0KTsoZnVuY3Rpb24oYyl7Yy5jbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLnJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYKKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxjdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5xZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMucmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLAoiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnJlKys7aWYoMTA8dGhpcy5yZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpOwp2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLmNsfHxXYTsoZnVuY3Rpb24oYyl7Yy5ibD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlJkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUmQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsCmEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLlhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJgohdGhpcy5lcT8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5lcT0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuY3UoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuYmx8fFhhOyhmdW5jdGlvbihjKXtjLmRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5kbHx8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVzPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVsxMF07dGhpcy5Hdz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs3XX1jLlpyPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLkhtKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd3OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyICRhPWMuWnJ8fCRhLFVjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLmRzKDQpOyhmdW5jdGlvbihjKXtjLmpqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5VKGIuZWxlbWVudCl9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sCnZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciBhYj1jLmpqfHxhYjsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgYmI9Yy5panx8YmI7KGZ1bmN0aW9uKGMpe2Mua2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLApmdW5jdGlvbihiKXtiPW5ldyBhYihiLmRldGFpbCk7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYmIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBjYj1jLmtqfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanU9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzFdO3RoaXMuVGo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzEwXTt0aGlzLmt0PXRoaXMuYVsyXTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qdTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5TaihhKX0sU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRqOgp0aGlzLktyKGEpfSxLcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHI6dGhpcy5qdChhKX0sanQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmt0OnRoaXMuc3AoYSl9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmw6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBlYj1jLkRyfHxlYixWYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy5pdSg0KTsoZnVuY3Rpb24oYyl7Yy5Eaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5MZihiLCJlbGVtZW50SUQiKTt0aGlzLnpnPWIucG9zaXRpb25pbmc7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuUGM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5QYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApObzpmdW5jdGlvbigpe2UuYWcodGhpcy5QYyk7ZS5iZyh0aGlzLlBjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTm8oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBmYj1jLkRqfHxmYjsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZ2I9Yy5Danx8Z2I7KGZ1bmN0aW9uKGMpe2MuRWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy54YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuTGYoYiwiZWxlbWVudElEIik7ZS5hZyhhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMudGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGhiPWMuRWp8fGhiLGliPW5ldyBoYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLll3PWI7Yi5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Lbjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuWXd8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLkpuKDQpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMucGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sSHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx2bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLnBqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuUGE9YTt0aGlzLkhmPXRoaXMubGg9ITE7dGhpcy50Zz1kO3RoaXMuUWc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuUGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8CjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLmJlKHRoaXMuUGEudXJsKSYmbS5yZCl7dmFyIGg9bmV3IHooYS51cmwpO2guSHUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLnFqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBhLmRhdGE7CmlmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5IZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUWc/dGhpcy52Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCExKTp0aGlzLnZiLm9wZW4odGhpcy5QYS5tZXRob2QsdGhpcy5QYS51cmwsITApLHRoaXMubGh8fCh0aGlzLnZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx0aGlzLnZiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5iZSh0aGlzLlBhLnVybCk/bS5yZD9tLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLmJlKHRoaXMuUGEudXJsKSwKdGhpcy50ZyYmdGhpcy50ZygpfXJldHVybiB0aGlzLnZifX19KShjKTt2YXIga2I9Yy5xanx8a2I7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuVWI9IiI7dGhpcy5IZD10aGlzLlRiPXRoaXMuZWI9bnVsbDt0aGlzLnhwPXRoaXMucWI9dGhpcy5pZz0hMTt0aGlzLnVhPSIiO3RoaXMuZGc9ITE7dGhpcy5CYT10aGlzLlhjPSIiO3RoaXMuJGY9dGhpcy5hYT10aGlzLmlzRW5hYmxlZD10aGlzLnhlPSExO3RoaXMuT2E9W107dGhpcy5UZj10aGlzLkliPSIiO3RoaXMuTmQ9ITE7dGhpcy5LZT0wO3RoaXMuWGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5WZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMucmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjsKdGhpcy5LYj0iIjt0aGlzLnJiPVtdO3RoaXMuTGI9W107dGhpcy5KYj0iIjt0aGlzLkxlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuWGQ9ITE7dGhpcy5Qbz10aGlzLnNkPW51bGw7dGhpcy5OZz10aGlzLnBjPXRoaXMuQWY9dGhpcy5OZT10aGlzLnJkPXRoaXMuSWQ9dGhpcy50Yz0hMTt0aGlzLlNhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLnJqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuVWIsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5UYixhZHRhZ3JlZ2V4OnRoaXMuSGQsanNwb3B1cHM6dGhpcy5pZyxzaWRlbG9hZHM6dGhpcy5xYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMudWEsaXNJbml0aWFsaXplZDp0aGlzLmRnLGdsb2JhbENvbmZpZzp0aGlzLlhjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCwKaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLiRmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkliLGhvbWFkQWRwYXRoOnRoaXMuVGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5OZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5LZSxIT01BRF9WRVJJRklFRDp0aGlzLlhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5WZSxIT01BRF9OT0JMT0NLRVI6dGhpcy53YixIT01BRF9BREJMT0NLRVI6dGhpcy5yYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuV2UsdGVzdEhpZGU6dGhpcy5LYix0ZXN0VGFnczp0aGlzLnJiLHRlc3RUYWdzSlM6dGhpcy5MYix0ZXN0Q29va2llOnRoaXMuSmIsdGhyb3R0bGU6dGhpcy5MZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLlhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuUG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy50YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuSWQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucmQsCnVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLk5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkhiLHNlcnZlcklkOnRoaXMuSWcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlliLHZwYWlkOnRoaXMucGMsc2tpcEFsbG93ZWQ6dGhpcy5OZ319LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJihhPSEwKTtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dGhpcy5TYVthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxwZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5wbyhhKX0sR2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixsPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLmFlKGEpO2U9dGhpcy5KYShhKTtjPyh0aGlzLmdjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsbD1lLnBhdGguc3Vic3RyKDEpKTooaD10aGlzLnplKCksbD1lLnBhdGguc3Vic3RyKDEpKyhlLnF1ZXJ5PyI/IitlLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuVWJ8fHRoaXMuZWJ8fAp0aGlzLlRifHx0aGlzLkhkKSYmKGw9dGhpcy5OcyhsKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnpxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1sO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGwpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmdjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTsKcmV0dXJuIGJ9LGdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxiZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLmFlKGEpO3JldHVybiBifSx6cTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudWEmJjA8dGhpcy51YS5sZW5ndGgpcmV0dXJuIHRoaXMudWE7Zm9yKGQgaW4gdGhpcy51YSlpZihiPXRoaXMudWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09CmEpcmV0dXJuIGIub3g7cmV0dXJuIm5vbmUifSxaYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMuSWddfSx6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWmMoKSxiPXRoaXMuTWcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb2c6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLkphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEQ9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksCmM9e30sbD0wO2w8RC5sZW5ndGg7bCsrKXt2YXIgdD1EW2xdLnNwbGl0KCI9Iik7Y1t0WzBdXT10WzFdfWZvcih2YXIgayBpbiBiW2hdLnN1YnZhbHVlcyljW2tdPXRoaXMub2coY1trXSxrLGJbaF0uc3VidmFsdWVzW2tdKTtEPVtdO2ZvcihrIGluIGMpRC5wdXNoKGsrIj0iK2Nba10pO2M9RD1lbmNvZGVVUklDb21wb25lbnQoRC5qb2luKCImIikpfWVsc2UgYz10aGlzLm9nKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9az1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWsucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sTnM6ZnVuY3Rpb24oYSl7dGhpcy5VYiYmKGErPXRoaXMuVWIpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3RoaXMuVGImJihhPXRoaXMuTXMoYSx0aGlzLlRiKSk7cmV0dXJuIGF9LApjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5kZz0hMDt0aGlzLlhjPWE7dGhpcy5CYT1iO3RoaXMueGU9ZDt0aGlzLnNkPWM7dGhpcy5OYz1lO3RoaXMuSGI9aHx8e307dGhpcy5ycygpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5CYSl0aGlzLnBzKCk7ZWxzZSB0cnl7dGhpcy5CYT1iKCksdGhpcy5JYygpfWNhdGNoKGwpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scnM6ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyB6KHRoaXMuWGMrdGhpcy56YygiZ2xvYmFsIikpLHRoaXMuTXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5JYygpfS5iaW5kKHRoaXMpLAohMCl9LHBzOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnpjKCJjbGllbnQiKSk7dGhpcy5JYShuZXcgeih0aGlzLkJhK3RoaXMuemMoImNsaWVudCIpKSx0aGlzLkljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx6YzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5uYigpO3RoaXMuSGImJnRoaXMuSGIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkhiJiZ0aGlzLkhiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSWQpe3RoaXMuSWQ9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07CnRoaXMuTmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OYz90aGlzLk5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmFhPXRoaXMuJGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVmUpKTt0aGlzLnViKCk7ZS5aYihrLlN0KTsoYj1lLlFmKHRoaXMuWmMoKSkpfHwoYj1lLlFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxNcTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5JYnx8dGhpcy51YXx8dGhpcy5JYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX19LEljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuT2E9YS5zZXJ2ZXJ8fFtdO3RoaXMuSWI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLlRmPWEuYWRwYXRofHwiIjt0aGlzLk5kPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuSWc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuT2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYiYmdGhpcy51YSYmdGhpcy5PYS5sZW5ndGg/dGhpcy5iZCghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSx0aGlzLnViKCkpfSxiZDpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy56ZSgpKSxjPXRoaXMuSmEodGhpcy5JYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkliK3RoaXMuemMoImN1c3RvbWVyIikpO3RoaXMuSWEoYix0aGlzLmF2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjdXN0b21lciIpO2E/dGhpcy5FbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLkVsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZCghMCl9LmJpbmQodGhpcyksCjEwMCkpOnRoaXMuYmQoITApfS5iaW5kKHRoaXMpLCEwKX19LGF2OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fXRoaXMucmQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy5OZT10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFmPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5ZYj10aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuS2I9Yi50ZXN0aGlkZXx8IiI7dGhpcy5yYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5VYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlRiPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5IZD1iLmFkdGFncmVnZXh8fApudWxsO3RoaXMuaWc9Yi5qc3BvcHVwc3x8ITE7dGhpcy5xYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5wYz1iLnZwYWlkfHwhMTt0aGlzLkhiLnZwYWlkPXRoaXMucGM7dGhpcy5OZz1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkVjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5KYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5OZCYmKHRoaXMuSmI9bnVsbCk7dGhpcy5MZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLlhkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5YZD0hMCx0aGlzLmJkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnN2KCkmJih0aGlzLktifHx0aGlzLkxifHx0aGlzLnJifHx0aGlzLkpiKT90aGlzLnhlPyh0aGlzLm9hPXRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSwKdGhpcy5KZCgpLHRoaXMudWIoKSk6dGhpcy5odigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLml2KCkpfX0saHY6ZnVuY3Rpb24oKXt0aGlzLmd2KCl9LGl2OmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKX0scWQ6ZnVuY3Rpb24oYSl7dGhpcy50Yz0hMDt0aGlzLmFhfHwodGhpcy5hYT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYShhKSksdGhpcy51YigpLHRoaXMuSmQoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5LYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLktiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5xZCh0aGlzLnJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VZygpfWVsc2UgdGhpcy5VZygpfSxUZzpmdW5jdGlvbigpe3ZhciBmO3ZhciBjO2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5uYigpKTt0aGlzLmx2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5IZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5yYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMucmI9bnVsbCx0aGlzLkhlKCl9LGx2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7ZSgpJiYKYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0sVWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoKSk7dGhpcy5tdihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLnFkKHRoaXMucmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuTGImJnRoaXMuTGIubGVuZ3RoKXt2YXIgYz10aGlzLkxiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVGcoKX0sbXY6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtoKCkmJmIoKX1mdW5jdGlvbiBlKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gbD8od2luZG93LmNsZWFyVGltZW91dChsKSwhMCk6ITF9dmFyIGw9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChtKXtmKCl9fSxIZTpmdW5jdGlvbigpe3RoaXMuSmI/KHRoaXMuS2UrKyx0aGlzLklhKG5ldyB6KHRoaXMuSmIpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuSWUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5SZygpfSxJZTpmdW5jdGlvbihhKXt0aGlzLnFkKHRoaXMuV2UsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuS2U/dGhpcy5IZSgpOnRoaXMuSWUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlJnKCk6dGhpcy5JZSgiQUFBIil9LFJnOmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKTt0aGlzLkpkKCl9LHViOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMudGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlhlKSk7CnRoaXMuc2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5zZCYmdGhpcy5zZCgpfSxNbzpmdW5jdGlvbigpe2lmKHRoaXMuTmUmJnRoaXMuVnEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sV2c6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsYyxmLGgsRCl7YT1uZXcga2IoYSxiLGMpO2YmJihhLmxoPSEwKTtoJiZlLlRyKCkmJihhLkhmPSEwKTtEJiYoYS5RZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxuZjpmdW5jdGlvbigpe2UuWWEoKXx8ZS5NYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmdjKCl8fChhPXRoaXMuSmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKaC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5oYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sTG86ZnVuY3Rpb24oKXt0aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5JYShhLHRoaXMuJHYuYmluZCh0aGlzKSx0aGlzLlp2LmJpbmQodGhpcykpfSwkdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuY3EoKX0sWnY6ZnVuY3Rpb24oKXt9LGNxOmZ1bmN0aW9uKCl7ZS5aYihrLmJxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxKZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnFiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMucWIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMucWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuTWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLmZjKCldPXRoaXM7ZS5NYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxzdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLkxlfSxIcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxsLGssbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsbD0oZiYxNSk8PDJ8ZT4+NixrPWUmNjMsaXNOYU4oZik/bD1rPTY0OmlzTmFOKGUpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHUseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTQwOzU5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfG4md3xwJncpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBsYj1jLnJqfHxsYixtPW5ldyBsYjt3aW5kb3cudHg9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vdT10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbN107CnRoaXMuRW49dGhpcy5hWzZdO3RoaXMuUXE9dGhpcy5hWzJdO3RoaXMueWs9dGhpcy5hWzVdO3RoaXMudWk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbN119Yy5GaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub3U6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fbjp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUXE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlrOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIG1iPWMuRml8fG1iLFhjPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5udSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmY9YTthLnUuTD90aGlzLk5hPWEudS5MKCk6dGhpcy5OYT0iIjt0aGlzLmNvbnRhaW5lcj10aGlzLmYuVGE7dGhpcy5wbGF5ZXI9dGhpcy5mLnU7dGhpcy5BYj10aGlzLkNjPSExO3RoaXMubm89MUUzO3RoaXMuZGE9bnVsbDt0aGlzLlA9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5vZD17fTt0aGlzLkFjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuQWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5mLnUpJiZ0aGlzLmYudS5CJiYoYT10aGlzLmYudS5CKCkpLHRoaXMuQWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7CnRoaXMubmQ9ITE7dGhpcy5sZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5tPXt9O3RoaXMueWM9ITE7dGhpcy5aZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkRiPSExO3RoaXMuaXA9ZS5wYSgxMCk7dGhpcy5kZD1lLnBhKDEwKTt0aGlzLm1lPWUucGEoMTApO3RoaXMuT2c9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWGI9dGhpcy5rYj0hMTt0aGlzLlFkPW51bGw7dGhpcy5aZD10aGlzLnVlPXRoaXMuS2Q9dGhpcy5NYz10aGlzLkdlPXRoaXMudmc9dGhpcy5RYz10aGlzLnl2PXRoaXMuYWI9ITF9Yy5saj1iO2IucHJvdG90eXBlPXtKZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxYZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuSGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuUC50Yz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQoay5tbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpfSxnZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuUC5hYSl0aGlzLlAuTW8oKSx0aGlzLlAub2EmJnRoaXMuUC5pc0VuYWJsZWQ/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5QLnBjfSkpOmI/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUC5wYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQ2EoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZ2UoYSwKYixjKX0sNTApfX0sc2U6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMTt0aGlzLm09YTt0aGlzLlB1KHRoaXMubSk7dGhpcy5SZihhKX0sUmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMub2Q9dGhpcy5KcShhKSksdGhpcy5SZihhLnBhcmVudCkpfSxKcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWil7Yj1hLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5aLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmCihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZ2E6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLk9jJiZhLk9jLmVycm9yJiZhLk9jLmVycm9yLmNvZGUmJihiPWEuT2MuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5xYy5jb2RlOmI9PUUueGQuY29kZT9lLkQoay50dyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpOihlLmhlKCksYj09RS4kZS5jb2RlJiZlLkQoay5Ucyx0aGlzLm0uUix0aGlzLmYudS5CKCksCnRoaXMuVCgpKSk7ZS5EKGsuYXEsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB4LlllLmNvZGU6ZS5EKGsuYXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LmFmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGsuQXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC55ZC5jb2RlOmUuRChrLkp3LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC53ZC5jb2RlOmUuRChrLlVzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLAp0aGlzLlhifHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLmxhJiYoYys9Il8iK2EuZXJyb3IubGEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5CYihhKTt0aGlzLkNhKCl9LEJiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5BYS5sZW5ndGg7KXRyeXt2YXIgYz1hLkFhLnBvcCgpO3RoaXMuZmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LFB1OmZ1bmN0aW9uKGEpe3RoaXMuS2Q9dGhpcy5aZD10aGlzLnVlPSExO3RoaXMucmE9dGhpcy5mLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmYuQzsKYi5NeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuQW4mJnRoaXMucGxheWVyLlRjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5UYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuTS5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5NW2NdLnR5cGUpJiZ0aGlzLnduKGIsYS5NW2NdLnVybCsiIixhLk1bY10udHlwZSk7dGhpcy5WZyhiKT8odGhpcy55bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmRhPQp0aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5tLmNwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5OdSgpKTp0aGlzLiRkKCk/dGhpcy5MZygpOnRoaXMubS5vcmlnaW4uQmYoeC53ZCl9LE51OmZ1bmN0aW9uKCl7ZS5yZigpO3RoaXMubSYmdGhpcy5tLm9yaWdpbiYmdGhpcy5tLm9yaWdpbi5TZSYmZS56bih0aGlzLm0ub3JpZ2luLlNlKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5mLkM7dGhpcy5mLkM9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuZi5DLGEpO3RoaXMuZi53ZygpOwp0aGlzLmYubGMoKTtmb3IoYT10aGlzLmYuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5mLmxjKCk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5mLkcuYXBwZW5kQ2hpbGQodGhpcy5PKTt0aGlzLk8ub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLkxxKCksYj10aGlzLm0uUi5PcmlnaW5hbEFkUGFyYW1ldGVycywKYz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDphLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTphLmRlc2lyZWRCaXRyYXRlfHxhLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpifSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuZi5HLnN0eWxlLmhlaWdodCl9fX07ZS56YSh0aGlzLk8sImNvbmZpZyIsYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnlvKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuUCk7dGhpcy5PLnNyYz1hO2UuRWQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt3KGEpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMubHcoKSx0aGlzLmYuY2MoITApKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmYuY2MoITApLHRoaXMubncoKSksIkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmNjKCEwKSx0aGlzLnJ3KCkpLCJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB3KCksIkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF3KCksIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coKSwiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3coKSwiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaWgoKSl9LmJpbmQodGhpcykpOwplLkVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcykpO2UuRWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmYudG4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxudzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpfSxsdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIil9LHJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlFhKCJzdGFydCIpfSxwdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtlLlFhKCJmaXJzdFF1YXJ0aWxlIil9LHF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpfSxzdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlFhKCJ0aGlyZFF1YXJ0aWxlIil9LApvdzpmdW5jdGlvbigpe3RoaXMudGQoKTtlLlFhKCJjb21wbGV0ZSIpfSxpaDpmdW5jdGlvbihhKXtpZih0aGlzLk8mJnRoaXMuTy5wYXJlbnROb2RlJiZ0aGlzLk8ucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLlFhKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLk8ucGFyZW50Tm9kZTt0aGlzLk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLk8pO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTt0aGlzLk89ZS5iYT0hMTt0aGlzLkNhKGEpfX0sa3c6ZnVuY3Rpb24oYSl7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLm1lc3NhZ2UsITApO2UuUWEoImVyciIsYS5tZXNzYWdlKTt0aGlzLmloKCEwKX0sd246ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5QO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5nYygpPyhmPWUuSmEoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsCiJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuY3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LHluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhoLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuUGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGg6ZnVuY3Rpb24oYSl7dGhpcy5BYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFifHx0aGlzLlBlKGEpfS5iaW5kKHRoaXMpLHRoaXMubm8pKX0sUGU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuQ2MmJnRoaXMuVmcodGhpcy52aWRlbykmJiF0aGlzLmtiJiYhdGhpcy5BYil7dGhpcy5DYz0hMDt0cnl7aWYoIWUuWWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMubS5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMua2J8fCh0aGlzLmtiPSEwLHRoaXMuaGQodGhpcy52aWRlbyksCmUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuUC5BZnx8dGhpcy5QLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuQ2EoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwiIiwhMCl9dGhpcy5idygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5mLmxjKCk7dGhpcy5laCgpO3RoaXMuZmgoKTt0aGlzLmxmKCk7dGhpcy5mLndnKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZlKCl9fSxGZTpmdW5jdGlvbigpe2lmKCF0aGlzLk1jKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuSGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuWWM9W107Zm9yKHZhciBiPXRoaXMuZi5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlljLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PQoibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMueGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsCmIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhjKCl9ZWxzZSB0aGlzLnhjKCl9LHhjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuWWMpZm9yKHZhciBiPTA7Yjx0aGlzLlljLmxlbmd0aDtiKyspdGhpcy5ZY1tiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5NY3x8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuQ2EoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLnBnKCEwKSx0aGlzLnhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLlpkJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy51ZT0hMH0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5GYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkZiLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LmJpbmQodGhpcyk7dGhpcy5UZCgpLktnKHRoaXMpfSx0ZDpmdW5jdGlvbigpe3RoaXMuUC5ZYiYmIXRoaXMua2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChrLmduLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5DYSgpfSxDYTpmdW5jdGlvbihhKXtpZighdGhpcy5LZClpZih0aGlzLktkPSEwLHRoaXMubS4kYXx8dGhpcy5tLlBiKXt0aGlzLkFiPXRoaXMuQ2M9ITE7dHJ5e3RoaXMuaGQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5uZD0hMTt0cnl7dGhpcy5mLmFoKCl9Y2F0Y2goZSl7fXRoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5EYj0hMTt0aGlzLlRkKCkuRWcoKTt0aGlzLm0uJGEmJnRoaXMubS5vcmlnaW4ubmUoKTt0aGlzLm0uUGImJihhP3RoaXMubS5vcmlnaW4ucWcoKTp0aGlzLkxkKCkpfWVsc2UgdGhpcy5MZCgpfSxjdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuJGQoKT90aGlzLkxnKCk6dGhpcy51ZChhKSl9LHVkOmZ1bmN0aW9uKGEpe3RoaXMuQWI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLiRkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHx0aGlzLlAubmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUC5uZigpKTt0aGlzLm0ub3JpZ2luLkJmKHgud2QpfSxRZTpmdW5jdGlvbigpe2lmKHRoaXMueXYpdGhpcy5DYSgpO2Vsc2V7dGhpcy5EYj0hMDt0aGlzLmYudS5sYiYmIXRoaXMuR2UmJnRoaXMuZi51LmxiKCkmJmUuRChrLktjLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLkR2KGEpO3ZhciBiPSIiO2lmKHRoaXMubS5FZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PZyk7YyYmKGI9dGhpcy5tLkVlLWEsMDxiP2I9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYik6KGI9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKSx0aGlzLm5kfHwodGhpcy5uZD0hMCxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGsubm4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLm0uJGE/KHRoaXMuQWI9dGhpcy5DYz0hMSx0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMubmQ9ITEsdGhpcy5mLmFoKCksdGhpcy5tLm9yaWdpbi5uZSgpKTp0aGlzLkNhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9Yil9dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsZS5JZih0aGlzLm0uZHVyYXRpb24tYSkpKTt0aGlzLnljPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxMZzpmdW5jdGlvbigpe3RoaXMuWGI9ITA7dGhpcy5yYT10aGlzLmYuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuRXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5mLkM9YTt2YXIgYj10aGlzLmYuQyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5mLmxjKCk7dGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyk7dGhpcy5kYS5hcHBlbmRDaGlsZChiKTt0aGlzLmVoKCk7dGhpcy5maCgpO3RoaXMuUWQ9c2V0SW50ZXJ2YWwodGhpcy5Lby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMubS5NLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5tLk1bY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUDtoLm9hJiZoLmlzRW5hYmxlZCYmIWguZ2MoKSYmKGU9aC5KYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LEtvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLm0uZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5RZCksdGhpcy50ZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLlFlKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLlFkKSwKdGhpcy51ZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFlnOmZ1bmN0aW9uKCl7dGhpcy52Z3x8KHRoaXMudmc9ITAsdGhpcy5RY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LER2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuWmd8fHRoaXMua2J8fCgwPT1hJiYodGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSksdGhpcy51ZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5aZD0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5ZZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuWWcoKX0uYmluZCh0aGlzKSksCnRoaXMuWGImJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLmtifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS5EKGsuam4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLkQoay5wbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWGImJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5ZYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuUWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQoay5obix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxhPT0KTWF0aC5mbG9vcih0aGlzLm0uZHVyYXRpb24vMikmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUuRChrLmxuLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLm0uZHVyYXRpb24vNCkmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLkQoay5ybix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxlLkQoay5zbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWmc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMua2Ipe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9CnRoaXMuS3EodGhpcy5tLkFhLGEpO2MubGVuZ3RoOyl0cnl7dmFyIGY9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMub2QuaW1wcmVzc2lvbnMmJmUuUnIoZi51cmwsdGhpcy5vZC5pbXByZXNzaW9ucyk/dGhpcy5mZShmLnVybCxmLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5EKGsua24sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpLHthZElkOnRoaXMub2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9KX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmZlKGYudXJsLGYudHlwZSl9Y2F0Y2goaCl7fWJ8fCh0aGlzLm0uQWE9dGhpcy5ycCh0aGlzLm0uQWEsYSkpfX0sZmU6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5QLkdhKGEpLGMmJmEudm4oYyksZnx8KGY9dGhpcy56ZiksdGhpcy5QLklhKGEsZix0aGlzLnpmLCExLCEwKSl9LEtxOmZ1bmN0aW9uKGEsCmIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHJwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyl9LGdoOmZ1bmN0aW9uKCl7ZS5EKGsuWm8sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7IXRoaXMuUWMmJmUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuc3EoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5tLkhjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMubS5IYywKdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIil9fSxlaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsCmUuSWYoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuUC5FYyYmKGI9dGhpcy5QLkVjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sYWM6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sa2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGZoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5pcDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPQoicmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLmRkO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF2LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2MuaWQ9dGhpcy5tZTtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnp2LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTsKZi5pZD10aGlzLk9nO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLm0uRWUmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz0KdGhpcy5kYS5hcHBlbmRDaGlsZChhKTt0aGlzLmYudS52YSYmdGhpcy5mLnUudmEoKSYmdGhpcy5wZygpO3RoaXMuYmMoKX19LGJjOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbGQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sQXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTt0aGlzLmYuQy5wYXVzZWQ/KHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSk6KHRoaXMuZi5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQoay5mZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTsKdGhpcy5mLkMucGF1c2VkfHwodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmZmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSx3dTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZCYmKHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LHp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tZSk7dGhpcy5mLkMubXV0ZWQ/KHRoaXMuZi5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOgoodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxwZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWUpO3RoaXMuZi5DLm11dGVkfHwodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxGYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5GYik7dGhpcy5NY3x8dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LApMZDpmdW5jdGlvbigpe3RoaXMuTWM9ITA7dGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5IYSYmdGhpcy55Y3x8InBvc3Ryb2xsIj09ZS5IYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuZi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmYubGMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpOwpiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTWQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5NZCgpfWVsc2UgdGhpcy5NZCgpfSxNZDpmdW5jdGlvbigpe3RoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5mLnh1KCk7dGhpcy5EYj0hMTtlLkQoay5ocCx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMuVGQoKS5FZygpfSxUZDpmdW5jdGlvbigpe3ZhciBhPQpudWxsO3RoaXMuZiYmdGhpcy5mLnUmJihhPXRoaXMuZi51KTtyZXR1cm4gYX0sJGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxsZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLmJnKHRoaXMudmlkZW8sYSk/dGhpcy53dSgpOnRoaXMucWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGYoKX0uYmluZCh0aGlzKSwxMDApKX0sVDpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMubSYmKGEuY2xpY2t0aHJvdWdoPXRoaXMubS5IYywKYS5kdXJhdGlvbj10aGlzLm0uZHVyYXRpb24sYS5hZFBvZD10aGlzLm0uJGEsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSx6ZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5sanx8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbT10aGlzLmFbNl07dGhpcy5Mdj10aGlzLmFbM107dGhpcy5hcD10aGlzLmFbN107dGhpcy5VdD10aGlzLmFbM107dGhpcy5tcT10aGlzLmFbM107dGhpcy5LaD10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLmJwPWI7Yi5wcm90b3R5cGU9e2RtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbTp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHY6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5hcDp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVXQ6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1xOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2g6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLmJwfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5kbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkxhPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUWI9dGhpcy5SYj0hMTt0aGlzLlNlPSIiO3RoaXMuUmU9ITE7ZCYmZC5lbXB0eT90aGlzLnVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLnRtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLndmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS50Zih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5wZChhKSkrIiZ0eXBlPWpzIiwKYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy50cy5iaW5kKHRoaXMpLHRoaXMucXMuYmluZCh0aGlzKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09CmUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5MYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYKInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6LTF9KTtyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3RoaXMubXUoYSk7dHJ5e3RoaXMuTGE9YS5yZXNwb25zZVhNTCx0aGlzLkxhfHwodGhpcy5MYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5KZigpO3RoaXMuUmI9dGhpcy5KZSgpO3RoaXMuUWI9dGhpcy5TZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnFjLHtlcnJvcjp0aGlzLlJlP0UueGQ6RS5aZX0pKX0sdXM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTGF8fCh0aGlzLkxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPXRoaXMuSmYoKTt0aGlzLlJiPXRoaXMuSmUoKTt0aGlzLlFiPXRoaXMuU2coKTt0aGlzLlcubGVuZ3RoP3RoaXMuaWMoKTp0aGlzLmdhKHRoaXMuRGEoeC5xYywKe2Vycm9yOnRoaXMuUmU/RS54ZDpFLlplfSkpfSxxczpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlllLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLldyKCk/dGhpcy5udigpPyhhKyssbmV3IGIodGhpcyx0aGlzLlNmKCksZyx7QWRTeXN0ZW06dGhpcy5xcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5hZikpOihhPTAsdGhpcy5YdigpJiZ0aGlzLnNlKHRoaXMua3AoKSkpfSxuZTpmdW5jdGlvbigpe3RoaXMuUmI/KHRoaXMuUmI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQubmUoKX0scWc6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLlFiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLmljKCkpOnRoaXMucGFyZW50LnFnKCl9LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3YoKT90aGlzLmp2KCk/ITA6KC0xIT10aGlzLiRiKCk/CnRoaXMuZ2EodGhpcy5EYSh4LlVlKSk6dGhpcy5nYSh0aGlzLkRhKHguaGkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnFjLEUuJGUpKSwhMSl9LHNlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5qZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlJiO2EuUGI9YS5QYj9hLlBiOnRoaXMuUWI7dGhpcy5wYXJlbnQuc2UoYSl9LGtwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy4kYigpO2EuTT10aGlzLk9mKCk7YS5IYz10aGlzLnRxKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5wcSgpO2EuRWU9dGhpcy5JcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguVWUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLnZxKCkpOmIuQWEuY29uY2F0KHRoaXMuQ3EoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5CYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LkJiJiYKdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0sQmY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxrdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2YoKS5sZW5ndGh9LGp2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy4kYigpfSxKZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuSmUoKSYmKGE9ITApO3JldHVybiBhfSxtdTpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuU2U9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLlJlPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFdyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5TZigpLmxlbmd0aH0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxxcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNkKHRoaXMuWiwiQWRTeXN0ZW0iKX0samU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwiRXJyb3IiXSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0KYS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx0cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxPZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLApEYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iikscng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSxwcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7CmEmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5XYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sJGI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LElxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLApkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxVZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5XYyhhKToiIn0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBVPWMudG18fFU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmtxPXRoaXMuYVs3XTt0aGlzLkNwPXRoaXMuYVs5XTt0aGlzLk1wPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HbDp0aGlzLmpxKGEpfSxqcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3E6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkNwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW46dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5odXx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkZsKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMuSGM9IiI7dGhpcy5SPXRoaXMuUGI9dGhpcy4kYT0hMTt0aGlzLm9yaWdpbj1udWxsfWMubWw9YjtiLnByb3RvdHlwZT17Y3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9CnRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBvYj1jLm1sfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMTBdO3RoaXMuVG49dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzNdO3RoaXMuZXY9dGhpcy5hWzZdO3RoaXMuams9dGhpcy5hWzVdO3RoaXMuaGo9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbNl19Yy5xbz0KYjtiLnByb3RvdHlwZT17enI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFyOnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ubjp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWk6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Mczp0aGlzLmR2KGEpfSxkdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXY6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmprOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5oajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMucW98fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLnpyKDQpOwp2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGhpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxxYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxhZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFllOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCmd4Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxVZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17WmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sJGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0saXg6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRnQ9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzhdO3RoaXMudmg9dGhpcy5hWzZdO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbN119Yy5ndD1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnQ6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZbTp0aGlzLnVoKGEpfSx1aDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmg6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlB0OnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXQ6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBzYj1jLmd0fHxzYixhZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQuRXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5PYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLlJpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5SaXx8cGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMuWGo9dGhpcy5hWzFdO3RoaXMuR3I9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuQXA9dGhpcy5hWzhdO3RoaXMueXc9dGhpcy5hWzNdO3RoaXMuZHg9dGhpcy5hWzddO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLlJvPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsyXX1jLkNpPWI7Yi5wcm90b3R5cGU9CntDaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGg6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3I6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNqOnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lajp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnl3OnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5keDp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaGw6dGhpcy5RbyhhKX0sUW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sbzp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciB0Yj1jLkNpfHx0YixiZD1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5DaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlRhPWEuS2YoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuZmc9ITE7dGhpcy5kYz1bXX1jLnNpPWI7Yi5wcm90b3R5cGU9e0dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCwKZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdxKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5QcihhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sJHU6ZnVuY3Rpb24oKXt0aGlzLmZnPSEwfSxhaDpmdW5jdGlvbigpe3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sd2c6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQoay5LYyx0aGlzLnUuQigpKX0seHU6ZnVuY3Rpb24oKXt0aGlzLmZnfHwodGhpcy51LnBsYXkoKSxlLkQoay5MYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYKKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5UYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlRhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuVGEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5HYiYmdGhpcy51LkdiKCk/dGhpcy51LktmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2MuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LFByOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGNjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudXEodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHwKYi5wb3NpdGlvbiE9dGhpcy5VYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5VYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuVWEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuVWEud2lkdGgmJjA8dGhpcy5VYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLldkKCk7cmV0dXJufXRoaXMuVWE9Yjt0aGlzLnUuR2IoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5jYy5iaW5kKHRoaXMpLDEwKX0sdG46ZnVuY3Rpb24oYSl7dGhpcy5kY3x8KHRoaXMuZGM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmRjLnB1c2goYSl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zaXx8TyxDPVtdLHViPTA7MTAwPnViO3ViKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixCKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdD10aGlzLmFbN107dGhpcy5Haz10aGlzLmFbNF07dGhpcy53dj10aGlzLmFbMl07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbNV19Yy56dD1iO2IucHJvdG90eXBlPXtDdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRHQ6dGhpcy5GayhhKX0sRms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdrOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Y6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkttOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6CnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgdmI9Yy56dHx8dmIsY2Q9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2QuQ3QoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuUyhhKTt0aGlzLkRlKGIpO3RoaXMueGYoKX0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5FYSgpLGE9dGhpcy52aWRlb1RhZzthfHwKKChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlUoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhmKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LCRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkVhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgd2I9Yy5aa3x8d2I7KGZ1bmN0aW9uKGMpe2MuWWs9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy55Yj10aGlzLnlifHwhMTt0aGlzLmVmPXRoaXMuaGY9dGhpcy5YZj10aGlzLmphPXRoaXMuTWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5mcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELAoiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk1lPSEwO3RoaXMuWGYmJnRoaXMucWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLkRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLlhmPSEwO3RoaXMucWYoKX0uYmluZCh0aGlzKSk7dGhpcy5tZigpfSxxZjpmdW5jdGlvbigpe2lmKCF0aGlzLnliKXt0aGlzLkZjKCk7aWYoIXRoaXMuTWUmJiF0aGlzLkZjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5NZSYmdGhpcy5lZiYmIXRoaXMuaGYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLAoxMDApfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LFBmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LG1mOmZ1bmN0aW9uKCl7aWYodGhpcy5GYygpKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuaGY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5lZj1iLm54fXRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1mKCl9LmJpbmQodGhpcyksMTAwKX0sdXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh4KCk6ITF9LCRiOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi4kYigpOi0xfSxEcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxmcTpmdW5jdGlvbihiLGEpe3RoaXMueWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy55Ynx8MzAyPT10aGlzLnliP3RoaXMuamE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnliKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfSxKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT8odGhpcy5vKCksdGhpcy5uYSgpKTpiLiRjKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLkRxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHhiPWMuWWt8fHhiOyhmdW5jdGlvbihjKXtjLiRrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sVXI6ZnVuY3Rpb24oKXt3aW5kb3cuT08ucWwuYW4uWm0/d2luZG93Lk9PLnFsLmFuLlptLmx4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVyKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLnhhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRmEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyB3YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgeGIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHliPWMuJGt8fHliLHpiPW5ldyB5YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbNV07dGhpcy5YbD10aGlzLmFbNF07dGhpcy5ieD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs4XX1jLllxPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhsOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ieDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6CnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NaDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuWXF8fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlhyKDQpOyhmdW5jdGlvbihjKXtjLk5sPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEdiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5ObHx8VjsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LkRkKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS5EZCgiIyIrYiwiYWRzTWFuYWdlckxvYWRGYWlsIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksCjFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5kdChhKX0uYmluZCh0aGlzKSk7eS5VcSgpfSxkdDpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufX10aGlzLmwoImFkZXJyb3IiLGEpO3RoaXMudygpfX0pfSkoYyk7dmFyIFc9Yy5NbHx8VzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUud3AoYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuSChkKSl7dGhpcy5KKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5BKTtmLmIoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxoPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5jZHx8Cih0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxvdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLmhjfHwodGhpcy5oYz1bXSksdGhpcy5oYy5wdXNoKGIpLHRoaXMudnUoKSYmKHRoaXMuRmcoKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LFVxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkub3YoYil9fSl9KShjKTt2YXIgQmI9Yy5PbHx8QmIseT1uZXcgQmIocSk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHQ9dGhpcy5hWzFdO3RoaXMuYW09dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzNdO3RoaXMuZnQ9dGhpcy5hWzJdO3RoaXMuZm89dGhpcy5hWzddO3RoaXMuR209dGhpcy5hWzVdO3RoaXMueGw9dGhpcy5hWzNdO3RoaXMuemw9dGhpcy5hWzRdO3RoaXMuYnI9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbNV19Yy5wdj1iO2IucHJvdG90eXBlPXtLdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTHQ6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XbTp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnQ6dGhpcy5lbyhhKX0sZW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mbzp0aGlzLkZtKGEpfSxGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206CnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bDp0aGlzLnlsKGEpfSx5bDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuemw6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJyOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5wdnx8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuV2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLldofHxEYjsoZnVuY3Rpb24oYyl7Yy5YaD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuYXV8fCh0aGlzLmF1PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlhofHwKRWI7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRmI9Yy5ZaHx8RmIsR2I9bmV3IEZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNpPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsyXTt0aGlzLnFyPXRoaXMuYVs5XTt0aGlzLkZzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzZdfWMuTG49YjtiLnByb3RvdHlwZT17Ymk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNpOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucXI6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5Mbnx8SGIsZmQ9bmV3IEhiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLmJpKDQpOyhmdW5jdGlvbihjKXtjLnltPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMueW18fEliOyhmdW5jdGlvbihjKXtjLnhtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMua2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLm9xfHwodGhpcy5ZZigpLAp0aGlzLm9xPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm8oKTp0aGlzLmtmPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMucygpKToodGhpcy5rZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sWWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnJxKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZZigpfS5iaW5kKHRoaXMpLDUwKX0sRng6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueG18fEpiOyhmdW5jdGlvbihjKXtjLnptPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEtiPWMuem18fEtiLExiPW5ldyBLYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Faz10aGlzLmFbOV07dGhpcy5Sdj10aGlzLmFbMTBdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMudXY9dGhpcy5hWzVdO3RoaXMub3Q9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbNl19Yy5Xbz1iO2IucHJvdG90eXBlPXtEazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWs6dGhpcy5RdihhKX0sUXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sdjp0aGlzLmttKGEpfSxrbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG06dGhpcy50dihhKX0sdHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnV2OnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciBNYj1jLldvfHxNYixnZD1uZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1nZC5Eayg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpOwpiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgTmI9Yy5aanx8TmI7KGZ1bmN0aW9uKGMpe2MuWWo9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuamgoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLkdmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLApmdW5jdGlvbigpe3RoaXMuR2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMucW4oKX0uYmluZCh0aGlzKSksdGhpcy5raD0hMSx0aGlzLnd3PTFFMyx0aGlzLnlnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxHZjpmdW5jdGlvbigpe3RoaXMueWcuZG9uZXx8KHRoaXMueWcuZG9uZT0hMCx0aGlzLmtoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qaCgpfS5iaW5kKHRoaXMpLHRoaXMud3cpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2gpO3RoaXMubygpfSxqaDpmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sTWY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHdhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5NZihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLk1mKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLllqfHxPYjsoZnVuY3Rpb24oYyl7Yy4kaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmCndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBQYj1jLiRqfHxQYixRYj1uZXcgUGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLkhzPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVs4XTt0aGlzLlZ1PXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzRdfWMuJHA9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZHI6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZ1OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgUmI9Yy4kcHx8UmIsaGQ9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLlR3KDQpOyhmdW5jdGlvbihjKXtjLklsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBTYj1jLklsfHxTYjsoZnVuY3Rpb24oYyl7Yy5IbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLAphKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpO3RoaXMuVmIoKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5jZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwKMTApfSxjZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgVGI9Yy5IbHx8VGI7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJgohd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLkpsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzRdO3RoaXMudnc9dGhpcy5hWzEwXTt0aGlzLkNrPXRoaXMuYVs0XTt0aGlzLlFrPXRoaXMuYVs2XTt0aGlzLlZoPXRoaXMuYVsyXTt0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLlhuPXRoaXMuYVsyXTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzVdfWMuZmo9YjtiLnByb3RvdHlwZT17VW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQ246dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZ3OnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dazp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWs6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZoOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5XbihhKX0sV246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhuOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMuZmp8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PQppZC5Vbyg0KTsoZnVuY3Rpb24oYyl7Yy5CbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuUyhiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy50ZT0hMX0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZHUoKX0uYmluZCh0aGlzKSw1MDApfSxkdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7CnJldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy50ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50ZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFh1OmZ1bmN0aW9uKCl7dGhpcy50ZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBYYj1jLkJsfHxYYjsoZnVuY3Rpb24oYyl7Yy5BbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuTmI9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk5ifHwodGhpcy5OYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsCiJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk5ifHx0aGlzLk5iKyssdGhpcy5OYjw9dGhpcy5Kcz8odGhpcy5OYisrLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSl9LHM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlh1KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBZYj1jLkFsfHxZYjsoZnVuY3Rpb24oYyl7Yy5DbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSwKdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWWIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBaYj1jLkNsfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUWk9dGhpcy5hWzNdO3RoaXMuQmg9dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVs5XTt0aGlzLlBuPXRoaXMuYVszXTt0aGlzLnVyPXRoaXMuYVs0XTt0aGlzLlpsPXRoaXMuYVsxXTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVs0XX1jLm9tPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RaTp0aGlzLkFoKGEpfSxBaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQmg6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRoOnRoaXMuUXUoYSl9LApRdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnU6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBuOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51cjp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWmw6dGhpcy5IcChhKX0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLklwOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIGFjPWMub218fGFjLGpkPW5ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLlBpKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT0KdGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBiYz1jLnNsfHxiYzsoZnVuY3Rpb24oYyl7Yy5ybD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBiKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuZXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuVmMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm1zKCk6dGhpcy5WYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZigpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5kZigpfHx0aGlzLnMoITApfSxtczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmMoKTshYi5tYSYmYi5XJiZiLmt4JiZiLm14JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlZjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwxMDApfSxWYzpmdW5jdGlvbigpe2lmKCF0aGlzLnVnKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy51Zz1iW2NdKTtyZXR1cm4gdGhpcy51Z30sY2U6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuVmMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKToKdGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNjPWMucmx8fGNjOyhmdW5jdGlvbihjKXtjLnRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGJjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBjYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBkYz1jLnRsfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmNtPXRoaXMuYVsxMF07dGhpcy51bz10aGlzLmFbOV07dGhpcy5CdD10aGlzLmFbN107dGhpcy5jbz10aGlzLmFbNV07dGhpcy5Haj10aGlzLmFbMTBdO3RoaXMucmg9dGhpcy5hWzVdO3RoaXMuY3M9dGhpcy5hWzFdO3RoaXMuaXE9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbMl19Yy5Fcj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY206dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVvOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CdDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucmg6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNzOnRoaXMuaHEoYSl9LApocTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaXE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLkVyfHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5ibSg0KTsoZnVuY3Rpb24oYyl7Yy5xaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hPwp0aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7CmIhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5xa3x8WDsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy52ZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnZlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMudmUmJmIhPXRoaXMudmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5KeCksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLnBrfHxZOyhmdW5jdGlvbihjKXtjLnJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFkoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5GZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLnJrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuS3UoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUua2cuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlsW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLmtnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVHA9dGhpcy5hWzZdO3RoaXMuT209dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzZdO3RoaXMuaT10aGlzLmFbOF19Yy5haj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5ObShhKX0sTm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5PbTp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYz1jLmFqfHxpYyxsZD1uZXcgaWMoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bGQuU3AoNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlMoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5Tcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX0sCkN1OmZ1bmN0aW9uKGIpe3RoaXMuQmQ9Yn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Tc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkJkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5CZCYmKG5ldyBJKHRoaXMsdGhpcy5CZCkpLmIoKSl9fSl9KShjKTt2YXIgTj1jLmdtfHxOOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5SZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuTXUoKTp0aGlzLnMoITApLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlJkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSwKWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuZm18fEk7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuQ3UodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuaG18fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51dD0KdGhpcy5hWzVdO3RoaXMuYXQ9dGhpcy5hWzVdO3RoaXMuenM9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbOV19Yy5Saz1iO2IucHJvdG90eXBlPXt0dDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF0OnRoaXMueXMoYSl9LHlzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56czp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYz1jLlJrfHxsYyxtZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC50dCg0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy51Zj0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmVhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51Zn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3pvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMudWY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCnt6bzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIG1jPWMubmt8fG1jOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE54OmZ1bmN0aW9uKCl7fSxxdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLlRlKG5ldyBmdW5jdGlvbigpe30pO2EuaHg9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IucXUoYSk7d2luZG93LnB4PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLnB1fHwodGhpcy5wdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLllkfHwodGhpcy5ZZD0xKTtpZigyMDx0aGlzLllkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkthKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuWWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEthOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5BZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSl9LFg6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBuYz1jLm1rfHxuYzsoZnVuY3Rpb24oYyl7Yy5vaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbWMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmthfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBuYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgb2M9Yy5va3x8b2MscGM9bmV3IG9jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sbj10aGlzLmFbMV07dGhpcy5Odz10aGlzLmFbN107dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5PcT10aGlzLmFbMV07dGhpcy5Zbz10aGlzLmFbNV07dGhpcy5hcz10aGlzLmFbM107dGhpcy53az10aGlzLmFbNl07dGhpcy5qbD10aGlzLmFbM107dGhpcy5Vdj10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVsxMF19Yy5OcD1iO2IucHJvdG90eXBlPXtRbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJuOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnc6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklrOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PcTp0aGlzLlhvKGEpfSxYbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW86dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFzOgp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLlR2KGEpfSxUdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVXY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBxYz1jLk5wfHxxYyxuZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Rbig0KTsoZnVuY3Rpb24oYyl7Yy5kaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVShhKTthJiZ0aGlzLlMoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLmRrfHxaOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlVmPTA7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPXRoaXMuZWM9dGhpcy5YYT10aGlzLkJjPSExO3RoaXMuQ2c9ZS5uYigxMCk7dGhpcy5jZygpfSxjZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT0KYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkthKCksITA7dGhpcy5VZisrO2lmKDEwPHRoaXMuVWYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLDEwMCksITF9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiYKZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PQphLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7CmJyZWFrfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuY2t8fGFhOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0KMDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIHJjPWMuZWt8fHJjLHNjPW5ldyByYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbMl07dGhpcy50aj10aGlzLmFbNl07dGhpcy5Qdz10aGlzLmFbN107dGhpcy5GaD10aGlzLmFbMTBdO3RoaXMuSWg9dGhpcy5hWzRdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMud2k9CnRoaXMuYVsxMF07dGhpcy5TbT10aGlzLmFbOV07dGhpcy5tdD10aGlzLmFbM107dGhpcy5Scz10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbMl19Yy52dD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXI6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMuT3coYSl9LE93OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qdzp0aGlzLkVoKGEpfSxFaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZoOnRoaXMuSGgoYSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaDp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndpOnRoaXMuUm0oYSl9LFJtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TbTp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXQ6CnRoaXMuUXMoYSl9LFFzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRjPWMudnR8fHRjLG9kPW5ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLmxyKDQpOyhmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSwkYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdWM9Yy5UaXx8dWM7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLApmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5zKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgdmM9Yy5TaXx8dmM7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB1YyhkKSxkLmthfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB2YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciB3Yz1jLlVpfHx3Yyx4Yz1uZXcgd2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuam09dGhpcy5hWzNdO3RoaXMuTm49CnRoaXMuYVs3XTt0aGlzLnl0PXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVs4XTt0aGlzLnpoPXRoaXMuYVs3XTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLmhrPXRoaXMuYVs5XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmFvPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMucm89YjtiLnByb3RvdHlwZT17aW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmptOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueXQ6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMueWgoYSl9LHloOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aDp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSXI6dGhpcy5nayhhKX0sZ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhrOnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubmk6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgeWM9Yy5yb3x8eWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuaW0oNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHpjPWMuWGl8fHpjOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLm9mKCl9LG9mOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5XaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyB6Yyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5rYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkgoYikpe3RoaXMuSihiKTsobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5ZaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkduPXRoaXMuYVs5XTt0aGlzLmx1PXRoaXMuYVs0XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLklpPXRoaXMuYVsxMF07dGhpcy52aj10aGlzLmFbOF07dGhpcy5rcj10aGlzLmFbMV07dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Saj10aGlzLmFbOF07dGhpcy5NaT10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs2XX1jLnlwPWI7Yi5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuR246dGhpcy5rdShhKX0sa3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmx1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSWk6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3I6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNyOnRoaXMuUWooYSl9LFFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Sajp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRGM9Yy55cHx8RGMscWQ9bmV3IERjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLkZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmVnPXRoaXMuaGc9dGhpcy5nZz0hMTt0aGlzLmVkPVtdO3RoaXMueWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIENjP251bGw6Q2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHNjP251bGw6c2MsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFVhP251bGw6VWEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBaYT9udWxsOlphLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOgplYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgaGM/bnVsbDpoYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgR2I/bnVsbDpHYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yz9udWxsOnhjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaWI/bnVsbDppYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBQYT9udWxsOlBhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFhP251bGw6cWF9fWMub2w9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5GcShhKTpbXSxiO3RoaXMuaGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2c9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuR2coYil9ZWxzZSBmb3IoYyBpbiB0aGlzLnllKXtpZih0aGlzLmVnKWJyZWFrO2I9dGhpcy55ZVtjXTt0aGlzLk9lKGIpJiYodGhpcy5lZC5wdXNoKGIpLHRoaXMuR2coYikpfX0sT2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxGcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjOwppZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMueWVbY10sdGhpcy5PZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxHZzpmdW5jdGlvbihhKXt0aGlzLk9lKGEpJiZhLmIoKX0sWnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdnKWZvcih0aGlzLmVnPSEwLGE9MDthPHRoaXMuZWQubGVuZ3RoO2ErKyl0aGlzLmVkW2FdLnRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWRbYV0udGIpfX19KShjKTt2YXIgRWM9Yy5vbHx8RWMsTD1uZXcgRWM7TC5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzFdO3RoaXMuUnQ9dGhpcy5hWzRdO3RoaXMuZ3I9dGhpcy5hWzVdO3RoaXMuTnQ9dGhpcy5hWzldO3RoaXMuYWk9dGhpcy5hWzNdO3RoaXMuYms9dGhpcy5hWzEwXTsKdGhpcy5CdT10aGlzLmFbNF07dGhpcy55cj10aGlzLmFbOV07dGhpcy5PaD10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVs5XX1jLmJuPWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5naTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5OdDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWk6dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJrOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CdTp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueXI6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9oOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEZjPWMuYm58fEZjLHJkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLmZpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlpiKGsuWXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5aYihrLlZzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ry53aWR0aD0xO0cuaGVpZ2h0PTE7Ry5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEcpO3ZhciBzZD1HLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5mYygpO0guWmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5aZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csCkguSnIoKSx7aWQ6dGR9KX0sNTAwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZ4PXRoaXMuYVsyXTt0aGlzLkV3PXRoaXMuYVsxXTt0aGlzLm9zPXRoaXMuYVs5XTt0aGlzLk9pPXRoaXMuYVs1XTt0aGlzLlhwPXRoaXMuYVs5XTt0aGlzLlpuPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzEwXX1jLlN3PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5meDp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXc6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9zOnRoaXMuTmkoYSl9LE5pOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PaTp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5abjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIEdjPWMuU3d8fEdjLHVkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLmV4KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5BZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuYWQ9MDt0aGlzLk5hPSIiO3RoaXMuZmQ9W107dGhpcy5nZD0wO3RoaXMuQmc9ITE7dGhpcy53ZT1bXX1jLm9oPWI7Yi5wcm90b3R5cGU9e0p1OmZ1bmN0aW9uKGEpe3RoaXMuQWc9YX0samQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFdTpmdW5jdGlvbihhKXt0aGlzLldhPWF9LER1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxrYzpmdW5jdGlvbihhLGIpe2UuamIoIndlbHQuZGUiKSYmZS5NYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5XYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLk5yKCkpdGhpcy5XYS5jKHRoaXMuV2EuWGMsdGhpcy5XYS5CYSx0aGlzLldhLnhlLGZ1bmN0aW9uKCl7dGhpcy5rYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLldhLk5jKTtlbHNlIGlmKHRoaXMuV3EoKSl0aGlzLnp1KGZ1bmN0aW9uKCl7dGhpcy5rYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuJHUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLkpnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklzKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5lZSYmKGM9dGhpcy5wbGF5ZXIuZWUoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZ2UoYSwKYyxmKTt0aGlzLnBsYXllci5LZyhsKX19LE5yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuYWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5hZC5nZXRUaW1lKCksdGhpcy5hZD1hLDNFNTxiPyEwOiExO3RoaXMuYWQ9YTtyZXR1cm4hMX0sVHU6ZnVuY3Rpb24oKXtlLkNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQ2YoYSkpP3RoaXMua2MoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGsuTGMsdGhpcy5wbGF5ZXIuQigpKSl9LFN1OmZ1bmN0aW9uKGEpe2UuQ2UoInBvc3Ryb2xsIik7aWYoIXRoaXMuQWcpe3RoaXMuSnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLkNmKGMpKT90aGlzLmtjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5MYyx0aGlzLnBsYXllci5CKCkpKX19LENmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxzdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk91KHRoaXMuU3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZmEoKX0sbWQ6ZnVuY3Rpb24oYSl7ZS5DZSgibWlkcm9sbCIpO2lmKCF0aGlzLm1nKXt0aGlzLm1nPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmtjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChrLkxjLHRoaXMucGxheWVyLkIoKSkpfX0scnU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5JdSh0aGlzLm1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmtlKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlR1KCk7dGhpcy5wbGF5ZXIua2UmJnRoaXMucnUoKTt0aGlzLnN1KCl9LHR1OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuZmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLlZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5nZD10aGlzLmZkLmxlbmd0aH0sV3E6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLmdkJiYoYT0hMCk7cmV0dXJuIGF9LHp1OmZ1bmN0aW9uKGEpe3RoaXMuQmc9YTtmb3IoYT0wO2E8dGhpcy5mZC5sZW5ndGg7YSsrKXRoaXMuZmRbYV1bImZ1bmN0aW9uIl0odGhpcy5ndS5iaW5kKHRoaXMpKX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5nZC0tO2EmJnRoaXMud2UucHVzaChhKTswPj10aGlzLmdkJiZ0aGlzLkJnKCl9LElzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLndlLmxlbmd0aDtjKyspYj10aGlzLndlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBoYT1jLm9ofHxoYSxTPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxMF07dGhpcy5saT10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVszXX1jLmZrPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLk52OnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5saTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZmt8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLk12KDQpfSkuY2FsbChhaXRoYWlOZ0llYmVpbG9vLGFpdGhhaU5nSWViZWlsb28pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.65.40 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.40.65.243.136.clients.your-server.de
Software
AmazonS3 /
Resource Hash
45a04c7005bb41f2314b6009e60eac10dd0391def8420cac4401442355e09c82

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
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
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
Tue, 27 Nov 2018 15:48:14 GMT
Connection
keep-alive
Content-Length
313
Last-Modified
Tue, 27 Nov 2018 09:03:20 GMT
Server
AmazonS3
Etag
"55bcf02ab6886a2e1347ccbc31cbb561"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de4-homad-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.259.0_de.html
imasdk.googleapis.com/js/core/ Frame 0BF3
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.259.0_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:81f::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.259.0_de.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_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
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
173075
date
Mon, 26 Nov 2018 15:59:56 GMT
expires
Tue, 26 Nov 2019 15:59:56 GMT
last-modified
Mon, 26 Nov 2018 15:57:00 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
85698
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
client.js
s0.2mdn.net/instream/video/
26 KB
10 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81f::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
Tue, 27 Nov 2018 15:48:14 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,35"
content-length
10523
x-xss-protection
1; mode=block
expires
Tue, 27 Nov 2018 15:48:14 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,dmFyIGFpdGhhaU5nSWViZWlsb289YWl0aGFpTmdJZWJlaWxvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kucGV8fCh5LnBlPTApO3kucGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5wZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk1hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5KZyhsKSxhLmdlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLnhvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLktjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuRXUobSk7YS5EdShsKTthLnR1KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubGs9dGhpcy5hWzldO3RoaXMuSnY9CnRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLkxsPXRoaXMuYVsxXTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLm1wPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuU3Y9YjtiLnByb3RvdHlwZT17a2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxrOnRoaXMuSXYoYSl9LEl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kdjp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG86dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5idihhKX0sYnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmN2OnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5tcDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgaWE9Yy5Tdnx8aWEsSWM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SWMua2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueG89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5yZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmZ1LmJpbmQodGhpcykpfWMubmo9YjtiLnByb3RvdHlwZT17cmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sem46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0sCnBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LHphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxmdTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5ldShhLmRhdGEpfSxldTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsCmNiOmJ9KX0sdGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55cShhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuamcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx5cTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYKKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0seG46ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLm5xKGEpKXJldHVybjsoYj10aGlzLnRmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxucTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxFZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LExmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxZdTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKYWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxiZzpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXQpcmV0dXJuITE7Yz10LmhlaWdodCp0LndpZHRoO2Q9dC53aWR0aDtmPXQuaGVpZ2h0OwowPnQudG9wJiYoZis9dC50b3ApO3QuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dC5sZWZ0JiYoZCs9dC5sZWZ0KTt0LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXQucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrCi4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxWZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHQ9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsCm09MzI4NTM3NzUyMCxuLGssdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPApwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXQ7az1BO3c9bDtxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmCjQyOTQ5NjcyOTU7dD10K24mNDI5NDk2NzI5NTtBPUErayY0Mjk0OTY3Mjk1O2w9bCt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHQpK2IoQSkrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHQsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix0PWMmNjMsaXNOYU4oZik/ZT10PTY0OmlzTmFOKGMpJiYodD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh0KTtyZXR1cm4gYn0sVHI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx3ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHQ9ITEsQT0hMSxrPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuc28/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxBPSF0JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KGt8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXQ7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWs7YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy53ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJgooYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtHaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxaaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxlcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxCbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sb286ZnVuY3Rpb24oKXtyZXR1cm4gYS5HaCgpfHxhLlpoKCl8fGEuZXIoKXx8YS5hbCgpfHxhLkJtKCl9fTtyZXR1cm4gYS5vbygpfSwKSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp7fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRZjpmdW5jdGlvbihhKXthPXRoaXMuSmEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxqYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHdwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LFd1OmZ1bmN0aW9uKGEsCmIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LElmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy4kZyhiKSsiOiIrdGhpcy4kZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LENlOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYiwKe2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxaYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5SYyhiLGQpKTtiJiYoaD1rLlJjKGEsYikpO2YmJihoPWsuUmMoaCxmKSk7YyYmKGg9ay5SYyhoLGMpKTtlLlpiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLm5jfHwodGhpcy5uYz17fSk7dGhpcy5uY1tmXXx8Cih0aGlzLm5jW2ZdPTApO3RoaXMubmNbZl0rKzsxMDx0aGlzLm5jW2ZdfHwoZj1tLnplKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxtLkdhKGYsITApLGY9bS5HYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixtLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxoZTpmdW5jdGlvbigpe20mJm0uYWE/bS5pc0VuYWJsZWQmJm0uTG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSw1MDApfSxTZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLldjKGEpOiIifSxXYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlVkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sCnlvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuYWUoYSl8fHRoaXMuVnIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LkhnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuRWYoYSkpcmV0dXJuIHRoaXMuRWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk1hKGEsYi51YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5aYygpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy54bihjLGEpO3JldHVybiBjfSxNYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHQpe3ZhciBrPWh8fG07aD0hMDt0JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suR2EoYSxoKTtoPWsuR2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT0KZFtxXTtyZXR1cm4gay5JYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoYSxiLGQsZixjLGssZSx0KX0uYmluZCh0aGlzKSw1MDApfSxqZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdD0hMDtlJiYodD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHQpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sc3M6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMubWMpZm9yKHZhciBjIGluIHRoaXMubWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5tY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuemIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxrZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKYy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnNzKGYuWmMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1jPWF9LFZ3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5NYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIiwKZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxwbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLAphPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFJyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLm5qfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5zeD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1qPWI7Yi5SYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuU3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHc9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07CmIuYXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnBuPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLmhuPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5sbj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ybj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuZ249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Iuam49e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlRzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmJxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Bdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5abz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLmhwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5MYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5LYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Iubm49e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLm1uPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5nZj17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuZmY9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Iuc249e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmtuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5Zdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Wcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMubWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzddO3RoaXMud3I9dGhpcy5hWzNdO3RoaXMudGg9dGhpcy5hWzRdO3RoaXMuUHM9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbMTBdfWMueGk9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLndyOnRoaXMuc2goYSl9LHNoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy50aDp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBqYT1jLnhpfHxqYSxKYz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1KYy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLm9qPWI7Yi5wcm90b3R5cGU9e1ZkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4Iil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFNjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5TYyhhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5TYyhNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGZjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVmQodGhpcy5mYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLlNjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxKcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZjKCkrIjIifSxaZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlZkKHRoaXMuQnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5TYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMub2p8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzEwXTt0aGlzLktrPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNl07dGhpcy5WcD10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs1XX1jLk1yPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eczp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2s6dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcDp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkJzOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIGthPWMuTXJ8fGthLEtjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLkNzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5UZT1ifSkoYyk7dmFyIEs9Yy5UZXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mbj10aGlzLmFbNV07dGhpcy5Waj10aGlzLmFbNl07dGhpcy5NbT10aGlzLmFbNV07dGhpcy5rbz10aGlzLmFbMl07dGhpcy5ZdD10aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbOF07dGhpcy5laj10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs2XX1jLnp3PWI7Yi5wcm90b3R5cGU9e2VuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5mbjp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlZqOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NbTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLll0OnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWo6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYT1jLnp3fHxsYSxMYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5lbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLm5sPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueWE9e307dGhpcy5BPW51bGw7dGhpcy5qYz0KMTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy5GdShiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKTowPnRoaXMueGEmJih0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYj50aGlzLnhhPyEwOiExfSxGZzpmdW5jdGlvbigpe3RoaXMub2I9MH0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZ1OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxBcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmZiKCldPWI7TCYmTC5oZyYmTC5adShiKX0sQXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5GYSh0aGlzLnlhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy55YSlpZihhPT0KdGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxTcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LE94OmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMubmx8fHI7KGZ1bmN0aW9uKGMpe2MucGw9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5qYz0xMDt0aGlzLm9iPTA7dGhpcy54YT01MDt0aGlzLks9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWI7dGhpcy5oYj0iIjt0aGlzLnlmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz0KYSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxPdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxJdTpmdW5jdGlvbihiKXt0aGlzLmxlPWJ9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV9LGtlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5vYjw9dGhpcy54YSYmKHRoaXMub2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmpjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxLZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxQeDpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5YcSgpfHx0aGlzLnVuKCk7dGhpcy5EZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHVuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLnBhKDEwKSl9LFhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LCRjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmthPSEwfSxHYjpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS2c6ZnVuY3Rpb24oYil7dGhpcy5oYj1ifSx5eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhifSxFZzpmdW5jdGlvbigpe3RoaXMuaGI9bnVsbH0sRXg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmhiJiYoYj0hMCk7cmV0dXJuIGJ9LEt4OmZ1bmN0aW9uKCl7dGhpcy55Znx8KHRoaXMueWY9ITApfSxUYzpmdW5jdGlvbigpe3JldHVybiExfSwKdng6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMucGx8fHA7KGZ1bmN0aW9uKGMpe2MucGg9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLkE9dGhpcy5wbGF5ZXI9IiI7dGhpcy5iZj0iMSI7dGhpcy5jZj0iMiI7dGhpcy4kbT0iMyI7dGhpcy5zYz0wO3RoaXMubmc9MzA7dGhpcy54Yj1bXTt0aGlzLlJhPVtdO3RoaXMuT2I9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuamY9dGhpcy5kaD0hMTt0aGlzLnN0YXR1cz10aGlzLnNjO3RoaXMuaWQ9ZS5wYSgxMCk7dGhpcy5qZChiKTt0aGlzLkd1KGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuZGh8fCh0aGlzLmRoPSEwLGUuaGUoKSl9LG9lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaWEoKT8hMToodGhpcy5MdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuV2coKSx0aGlzLmpmPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxsOmZ1bmN0aW9uKGIsYSl7dGhpcy5pYSgpfHwodGhpcy54Yi5wdXNoKGIpLHRoaXMuUmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy54YiYmMDx0aGlzLnhiLmxlbmd0aCYmKHRoaXMueGI9ZS51bmlxdWUodGhpcy54YiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMueGIuam9pbigiLCIpKSk7aWYodGhpcy5SYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlJhLmxlbmd0aDtnKyspdGhpcy5PYlt0aGlzLlJhW2ddLnJlYXNvbl09PQp0aGlzLk9iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuT2JbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuT2JbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksYj10aGlzLlJhW2ddLnJlYXNvbik7dGhpcy5PYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LER4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamZ9LG86ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJmfSxMdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuY2Z9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kbX0scGI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnNjfSxkZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5iZn0sang6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuY2Z9LAppYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5zY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sQXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSx2czpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMucGh8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Y9dGhpcy5hWzZdO3RoaXMuSnQ9dGhpcy5hWzldO3RoaXMuTWs9dGhpcy5hWzNdO3RoaXMubGw9dGhpcy5hWzJdO3RoaXMuemo9dGhpcy5hWzEwXTt0aGlzLml0PXRoaXMuYVs1XTt0aGlzLlZsPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs0XTt0aGlzLlRsPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzEwXX1jLnd0PWI7Yi5wcm90b3R5cGU9e1Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuV3Y6dGhpcy5JdChhKX0sSXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkp0OnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Nazp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpqOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pdDp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVmw6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9wOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5UbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIG5hPWMud3R8fG5hLE1jPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Wdig0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpOwp2YXIgVD1jLnBpfHxUOyhmdW5jdGlvbihjKXtjLm9pPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy52ZD1udWxsO3RoaXMuZHc9MUUzO3RoaXMueGc9bnVsbDt0aGlzLnh2PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5zbyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLmdxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5UcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLlNxKGEsYil9LmJpbmQodGhpcykpO2IudnBFdmVudCYmKGIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5ndyhiKX0uYmluZCh0aGlzKSksYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuaHcoYil9LmJpbmQodGhpcykpKTsKYi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuUnEoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLmZwKGEpfS5iaW5kKHRoaXMpKX0sZnA6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxndzpmdW5jdGlvbihiKXt0aGlzLnZkfHwodGhpcy52ZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaXcoYil9LmJpbmQodGhpcyksdGhpcy5kdykpfSxpdzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCk7dGhpcy53KCl9LGh3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZkKX0sUnE6ZnVuY3Rpb24oYil7dGhpcy5xeChiKTt0aGlzLnhnPW5ldyBEYXRlO3RoaXMueGctdGhpcy5idTx0aGlzLnh2P3RoaXMudygpOnRoaXMubygpfSxUcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmpkKG5ldyBUKGEpKSk7CnRoaXMudygpfSxncTpmdW5jdGlvbigpe30sU3E6ZnVuY3Rpb24oKXt0aGlzLmJ1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIG9hPWMub2l8fG9hOyhmdW5jdGlvbihjKXtjLnJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuRmEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyBvYShnLHRoaXMuQSkpLmIoKSl9fXRoaXMuSSgpfX19KX0pKGMpO3ZhciBwYT1jLnJpfHxwYSxxYT1uZXcgcGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnA9dGhpcy5hWzhdO3RoaXMuaT0KdGhpcy5hWzFdfWMuZmw9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnZwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcmE9Yy5mbHx8cmEsTmM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudXAoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt0aGlzLkRmKCk7dGhpcy5GZigpO3RoaXMuZ3A9ITF9LERmOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuRWI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlOwp0aGlzLlMoYil9LEZmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3ZhciBiPXRoaXMuRWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkViPSEwKTt0aGlzLlUoYSl9fSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmCigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKSl9LGtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMubWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpKX0sbWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmCmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5sZSYmKDAsdGhpcy5sZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LAp2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxUYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuT2p8fHNhOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5zYzt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJgooYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMub2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm5nJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5ncD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEucWUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMub2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmcmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy53Yy5pbmRleE9mKGEpJiYKdGhpcy53Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMud2MubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LHZzOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuUGQ/dGhpcy5QZCsrOnRoaXMuUGQ9MTp0aGlzLk9kP3RoaXMuT2QrKzp0aGlzLk9kPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLll1KGEudmlkZW9UYWcpP2EuRWI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy51Y3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLk9kPnRoaXMuUGQmJihiPSExKSx0aGlzLncoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5EZigpLGEuRmYoKSxhLkVifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHRhPWMuTmp8fHRhOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuSmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5TcihnKXx8KHRoaXMuSihnKSxnPW5ldyB0YShnLHRoaXMuQSksCmcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0seHg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sd3E6ZnVuY3Rpb24oKXt2YXIgYj1lLkphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLlBqfHx1YSx2YT1uZXcgdWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3A9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuVmk9YjtiLnByb3RvdHlwZT17RnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgd2E9Yy5WaXx8d2EsT2M9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLkZwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLkRtfHx4YTsoZnVuY3Rpb24oYyl7Yy5DbT11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB5YT1jLkNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5FbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJgp3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgemE9Yy5FbXx8emEsQWE9bmV3IHphKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh2PXRoaXMuYVs1XTt0aGlzLktwPXRoaXMuYVs3XTt0aGlzLkN3PXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVsyXTt0aGlzLlpzPXRoaXMuYVs5XTsKdGhpcy5QcD10aGlzLmFbNl07dGhpcy5jdD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbMTBdO3RoaXMuUHY9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbM119Yy5HaT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHY6dGhpcy5KcChhKX0sSnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLktwOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddzp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5ZcyhhKX0sWXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpzOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QcDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3Q6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnppOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuUHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLkdpfHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5Hdig0KTsoZnVuY3Rpb24oYyl7Yy52bT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlUoYik6dGhpcy5lYSgpKTp0aGlzLmVhKCl9ZWxzZSB0aGlzLmVhKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgQ2E9Yy52bXx8Q2E7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT10aGlzLmVjPXRoaXMuWGE9dGhpcy5CYz0hMTt0aGlzLkNnPWUubmIoMTApO3RoaXMuYmg9ITA7dGhpcy5HZD10aGlzLldmPSExO3RoaXMuc2coKTt0aGlzLklvKCk7dGhpcy5LYSgpfSxMeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLHR5cGVvZiBiLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuVz9iLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkYsIjsiLHR5cGVvZiBiLkYsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5zYT9iLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLnNhP3R5cGVvZiBiLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi56ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5BZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuRmQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5GZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNnKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxVYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj10aGlzLmdiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5tYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5tYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5tYX0sTmY6ZnVuY3Rpb24oKXtpZighdGhpcy5lYyl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5lYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmVjfSwKUXI6ZnVuY3Rpb24oKXtpZighdGhpcy5WZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5PcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVmY9ITApfXJldHVybiB0aGlzLlZmfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuQmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkJjPSEwKTtyZXR1cm4gdGhpcy5CY30sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuQWUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLkdkPSEwO3ZhciBiPXRoaXMuTmYoKTtpZihifHx0aGlzLmlhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuU2I9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLlNiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5TYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuWSgpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHd4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5zZiYmYi5hZHMmJih0aGlzLnNmPWIuYWRzKTtyZXR1cm4gdGhpcy5zZn0sSW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMub2UoKX0uYmluZCh0aGlzKSl9LHZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5OZigpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmYoKX0uYmluZCh0aGlzKSw1MCl9LHNnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPApiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5RcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlVjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlVjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLmdiKCl9ZWxzZSB0aGlzLldmP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nYigpLGI9dGhpcy5VYygpO2EmJiFiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWSgpKToodGhpcy5ZKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxKbzpmdW5jdGlvbigpe3RoaXMuV2J8fCh0aGlzLldiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5XYiE9Yi5hZHMuc3RhdGUmJih0aGlzLldiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLldiKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuV2I9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpvKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITA7dGhpcy5vKCJlbXB0eSB2YXN0Iil9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLmJoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLmJoLGZ1bmN0aW9uKCl7dGhpcy52ZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxPbzpmdW5jdGlvbigpe3RoaXMuR3h8fCgxMDx0aGlzLmV3Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApKToodGhpcy5ldysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9vKCl9LmJpbmQodGhpcyksNTApKSl9LHV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5mdyl7dGhpcy5mdz0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy51bXx8RGE7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUGcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLlBnKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LFBnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTt2YXIgRWE9Yy53bXx8RWEsRmE9bmV3IEVhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl3PXRoaXMuYVs5XTt0aGlzLkN2PXRoaXMuYVs5XTt0aGlzLlhzPXRoaXMuYVs2XTt0aGlzLkh0PXRoaXMuYVs0XTt0aGlzLiR0PXRoaXMuYVs2XTt0aGlzLnhoPXRoaXMuYVs3XTt0aGlzLlh3PXRoaXMuYVs3XTt0aGlzLnNtPXRoaXMuYVszXTt0aGlzLlFtPQp0aGlzLmFbN107dGhpcy5xbT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs0XX1jLmpwPWI7Yi5wcm90b3R5cGU9e0h3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jdzp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3Y6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhzOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdDp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuJHQ6dGhpcy53aChhKX0sd2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhoOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ydzp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnFtOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgR2E9Yy5qcHx8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSHcoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksCmc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApOwpyZXR1cm4gYn0sVGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuUWx8fEhhOyhmdW5jdGlvbihjKXtjLlBsPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm9jPSExO3RoaXMuRGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5vYz0KITAsdGhpcy5vKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy5HYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLnBmKCk6dGhpcy5vKCl9LEdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm9jPSEwLHRoaXMubygpOwp0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMub2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5HYy5iaW5kKHRoaXMpLDEwMCl9fSxwZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSwKdGhpcy5vKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGYuYmluZCh0aGlzKSw1MCl9fSxEZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7CmIuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5vYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5QbHx8SWE7KGZ1bmN0aW9uKGMpe2MuUmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiYKdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuUmx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbMTBdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuRXA9dGhpcy5hWzldO3RoaXMuT2s9dGhpcy5hWzhdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuTHc9dGhpcy5hWzEwXTt0aGlzLm5oPXRoaXMuYVsyXTt0aGlzLnFwPXRoaXMuYVs2XTt0aGlzLlZuPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLkRsPWI7Yi5wcm90b3R5cGU9e1p3OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuJHc6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxzOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FcDp0aGlzLk5rKGEpfSxOazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2s6dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJpOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbjp0aGlzLkt3KGEpfSxLdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHc6dGhpcy5taChhKX0sbWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5oOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcDp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZuOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5EbHx8TGEsUmM9bmV3IExhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLlp3KDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMucmc9YX0sTjpmdW5jdGlvbigpe30saWU6ZnVuY3Rpb24oYil7dGhpcy5yZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5yZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5RaHx8TWE7KGZ1bmN0aW9uKGMpe2MuUGg9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0saWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLlBofHxOYTsoZnVuY3Rpb24oYyl7Yy5SaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuaWUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuaWUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5SaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuVms9dGhpcy5hWzEwXTt0aGlzLkhvPXRoaXMuYVs5XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLmppPXRoaXMuYVs4XTt0aGlzLkZ2PXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5zdD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs5XX1jLnl1PWI7Yi5wcm90b3R5cGU9e3dqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlVrKGEpfSxVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ibzp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSWo6dGhpcy5paShhKX0saWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmppOnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdjoKdGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFrOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54czp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3Q6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBRYT1jLnl1fHxRYSxTYz1uZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53aig0KTsoZnVuY3Rpb24oYyl7Yy50az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksCmE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLnRrfHxSYTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnZjKCl9LmJpbmQodGhpcykpLAokKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSkpOnRoaXMudmMoKX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuc2t8fFNhOyhmdW5jdGlvbihjKXtjLnVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj0KbmV3IFJhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgU2EoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRhPWMudWt8fFRhLFVhPW5ldyBUYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdz10aGlzLmFbNV07dGhpcy4kcT10aGlzLmFbMl07dGhpcy5VbT10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzRdO3RoaXMuRm89dGhpcy5hWzRdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOF19Yy5BbT1iO2IucHJvdG90eXBlPXtRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRxOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLkJqOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLkFtfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Rdyg0KTsoZnVuY3Rpb24oYyl7Yy5jbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLnJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYKKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxjdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5xZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMucmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLAoiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnJlKys7aWYoMTA8dGhpcy5yZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpOwp2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLmNsfHxXYTsoZnVuY3Rpb24oYyl7Yy5ibD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlJkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUmQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsCmEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLlhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJgohdGhpcy5lcT8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5lcT0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuY3UoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuYmx8fFhhOyhmdW5jdGlvbihjKXtjLmRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5kbHx8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVzPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVsxMF07dGhpcy5Hdz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs3XX1jLlpyPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLkhtKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd3OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyICRhPWMuWnJ8fCRhLFVjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLmRzKDQpOyhmdW5jdGlvbihjKXtjLmpqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5VKGIuZWxlbWVudCl9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sCnZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciBhYj1jLmpqfHxhYjsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgYmI9Yy5panx8YmI7KGZ1bmN0aW9uKGMpe2Mua2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLApmdW5jdGlvbihiKXtiPW5ldyBhYihiLmRldGFpbCk7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYmIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBjYj1jLmtqfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanU9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzFdO3RoaXMuVGo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzEwXTt0aGlzLmt0PXRoaXMuYVsyXTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qdTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5TaihhKX0sU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRqOgp0aGlzLktyKGEpfSxLcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHI6dGhpcy5qdChhKX0sanQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmt0OnRoaXMuc3AoYSl9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmw6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBlYj1jLkRyfHxlYixWYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy5pdSg0KTsoZnVuY3Rpb24oYyl7Yy5Eaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5MZihiLCJlbGVtZW50SUQiKTt0aGlzLnpnPWIucG9zaXRpb25pbmc7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuUGM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5QYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApObzpmdW5jdGlvbigpe2UuYWcodGhpcy5QYyk7ZS5iZyh0aGlzLlBjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTm8oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBmYj1jLkRqfHxmYjsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZ2I9Yy5Danx8Z2I7KGZ1bmN0aW9uKGMpe2MuRWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy54YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuTGYoYiwiZWxlbWVudElEIik7ZS5hZyhhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMudGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGhiPWMuRWp8fGhiLGliPW5ldyBoYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLll3PWI7Yi5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Lbjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuWXd8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLkpuKDQpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMucGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sSHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx2bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLnBqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuUGE9YTt0aGlzLkhmPXRoaXMubGg9ITE7dGhpcy50Zz1kO3RoaXMuUWc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuUGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8CjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLmJlKHRoaXMuUGEudXJsKSYmbS5yZCl7dmFyIGg9bmV3IHooYS51cmwpO2guSHUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLnFqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBhLmRhdGE7CmlmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5IZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUWc/dGhpcy52Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCExKTp0aGlzLnZiLm9wZW4odGhpcy5QYS5tZXRob2QsdGhpcy5QYS51cmwsITApLHRoaXMubGh8fCh0aGlzLnZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx0aGlzLnZiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5iZSh0aGlzLlBhLnVybCk/bS5yZD9tLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLmJlKHRoaXMuUGEudXJsKSwKdGhpcy50ZyYmdGhpcy50ZygpfXJldHVybiB0aGlzLnZifX19KShjKTt2YXIga2I9Yy5xanx8a2I7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuVWI9IiI7dGhpcy5IZD10aGlzLlRiPXRoaXMuZWI9bnVsbDt0aGlzLnhwPXRoaXMucWI9dGhpcy5pZz0hMTt0aGlzLnVhPSIiO3RoaXMuZGc9ITE7dGhpcy5CYT10aGlzLlhjPSIiO3RoaXMuJGY9dGhpcy5hYT10aGlzLmlzRW5hYmxlZD10aGlzLnhlPSExO3RoaXMuT2E9W107dGhpcy5UZj10aGlzLkliPSIiO3RoaXMuTmQ9ITE7dGhpcy5LZT0wO3RoaXMuWGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5WZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMucmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjsKdGhpcy5LYj0iIjt0aGlzLnJiPVtdO3RoaXMuTGI9W107dGhpcy5KYj0iIjt0aGlzLkxlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuWGQ9ITE7dGhpcy5Qbz10aGlzLnNkPW51bGw7dGhpcy5OZz10aGlzLnBjPXRoaXMuQWY9dGhpcy5OZT10aGlzLnJkPXRoaXMuSWQ9dGhpcy50Yz0hMTt0aGlzLlNhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLnJqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuVWIsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5UYixhZHRhZ3JlZ2V4OnRoaXMuSGQsanNwb3B1cHM6dGhpcy5pZyxzaWRlbG9hZHM6dGhpcy5xYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMudWEsaXNJbml0aWFsaXplZDp0aGlzLmRnLGdsb2JhbENvbmZpZzp0aGlzLlhjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCwKaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLiRmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkliLGhvbWFkQWRwYXRoOnRoaXMuVGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5OZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5LZSxIT01BRF9WRVJJRklFRDp0aGlzLlhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5WZSxIT01BRF9OT0JMT0NLRVI6dGhpcy53YixIT01BRF9BREJMT0NLRVI6dGhpcy5yYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuV2UsdGVzdEhpZGU6dGhpcy5LYix0ZXN0VGFnczp0aGlzLnJiLHRlc3RUYWdzSlM6dGhpcy5MYix0ZXN0Q29va2llOnRoaXMuSmIsdGhyb3R0bGU6dGhpcy5MZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLlhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuUG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy50YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuSWQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucmQsCnVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLk5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkhiLHNlcnZlcklkOnRoaXMuSWcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlliLHZwYWlkOnRoaXMucGMsc2tpcEFsbG93ZWQ6dGhpcy5OZ319LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJihhPSEwKTtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dGhpcy5TYVthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxwZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5wbyhhKX0sR2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixsPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLmFlKGEpO2U9dGhpcy5KYShhKTtjPyh0aGlzLmdjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsbD1lLnBhdGguc3Vic3RyKDEpKTooaD10aGlzLnplKCksbD1lLnBhdGguc3Vic3RyKDEpKyhlLnF1ZXJ5PyI/IitlLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuVWJ8fHRoaXMuZWJ8fAp0aGlzLlRifHx0aGlzLkhkKSYmKGw9dGhpcy5OcyhsKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnpxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1sO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGwpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmdjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTsKcmV0dXJuIGJ9LGdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxiZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLmFlKGEpO3JldHVybiBifSx6cTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudWEmJjA8dGhpcy51YS5sZW5ndGgpcmV0dXJuIHRoaXMudWE7Zm9yKGQgaW4gdGhpcy51YSlpZihiPXRoaXMudWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09CmEpcmV0dXJuIGIub3g7cmV0dXJuIm5vbmUifSxaYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMuSWddfSx6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWmMoKSxiPXRoaXMuTWcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb2c6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLkphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEQ9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksCmM9e30sbD0wO2w8RC5sZW5ndGg7bCsrKXt2YXIgdD1EW2xdLnNwbGl0KCI9Iik7Y1t0WzBdXT10WzFdfWZvcih2YXIgayBpbiBiW2hdLnN1YnZhbHVlcyljW2tdPXRoaXMub2coY1trXSxrLGJbaF0uc3VidmFsdWVzW2tdKTtEPVtdO2ZvcihrIGluIGMpRC5wdXNoKGsrIj0iK2Nba10pO2M9RD1lbmNvZGVVUklDb21wb25lbnQoRC5qb2luKCImIikpfWVsc2UgYz10aGlzLm9nKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9az1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWsucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sTnM6ZnVuY3Rpb24oYSl7dGhpcy5VYiYmKGErPXRoaXMuVWIpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3RoaXMuVGImJihhPXRoaXMuTXMoYSx0aGlzLlRiKSk7cmV0dXJuIGF9LApjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5kZz0hMDt0aGlzLlhjPWE7dGhpcy5CYT1iO3RoaXMueGU9ZDt0aGlzLnNkPWM7dGhpcy5OYz1lO3RoaXMuSGI9aHx8e307dGhpcy5ycygpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5CYSl0aGlzLnBzKCk7ZWxzZSB0cnl7dGhpcy5CYT1iKCksdGhpcy5JYygpfWNhdGNoKGwpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scnM6ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyB6KHRoaXMuWGMrdGhpcy56YygiZ2xvYmFsIikpLHRoaXMuTXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5JYygpfS5iaW5kKHRoaXMpLAohMCl9LHBzOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnpjKCJjbGllbnQiKSk7dGhpcy5JYShuZXcgeih0aGlzLkJhK3RoaXMuemMoImNsaWVudCIpKSx0aGlzLkljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx6YzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5uYigpO3RoaXMuSGImJnRoaXMuSGIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkhiJiZ0aGlzLkhiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSWQpe3RoaXMuSWQ9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07CnRoaXMuTmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OYz90aGlzLk5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmFhPXRoaXMuJGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVmUpKTt0aGlzLnViKCk7ZS5aYihrLlN0KTsoYj1lLlFmKHRoaXMuWmMoKSkpfHwoYj1lLlFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxNcTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5JYnx8dGhpcy51YXx8dGhpcy5JYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX19LEljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuT2E9YS5zZXJ2ZXJ8fFtdO3RoaXMuSWI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLlRmPWEuYWRwYXRofHwiIjt0aGlzLk5kPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuSWc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuT2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYiYmdGhpcy51YSYmdGhpcy5PYS5sZW5ndGg/dGhpcy5iZCghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSx0aGlzLnViKCkpfSxiZDpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy56ZSgpKSxjPXRoaXMuSmEodGhpcy5JYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkliK3RoaXMuemMoImN1c3RvbWVyIikpO3RoaXMuSWEoYix0aGlzLmF2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjdXN0b21lciIpO2E/dGhpcy5FbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLkVsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZCghMCl9LmJpbmQodGhpcyksCjEwMCkpOnRoaXMuYmQoITApfS5iaW5kKHRoaXMpLCEwKX19LGF2OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fXRoaXMucmQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy5OZT10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFmPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5ZYj10aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuS2I9Yi50ZXN0aGlkZXx8IiI7dGhpcy5yYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5VYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlRiPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5IZD1iLmFkdGFncmVnZXh8fApudWxsO3RoaXMuaWc9Yi5qc3BvcHVwc3x8ITE7dGhpcy5xYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5wYz1iLnZwYWlkfHwhMTt0aGlzLkhiLnZwYWlkPXRoaXMucGM7dGhpcy5OZz1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkVjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5KYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5OZCYmKHRoaXMuSmI9bnVsbCk7dGhpcy5MZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLlhkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5YZD0hMCx0aGlzLmJkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnN2KCkmJih0aGlzLktifHx0aGlzLkxifHx0aGlzLnJifHx0aGlzLkpiKT90aGlzLnhlPyh0aGlzLm9hPXRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSwKdGhpcy5KZCgpLHRoaXMudWIoKSk6dGhpcy5odigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLml2KCkpfX0saHY6ZnVuY3Rpb24oKXt0aGlzLmd2KCl9LGl2OmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKX0scWQ6ZnVuY3Rpb24oYSl7dGhpcy50Yz0hMDt0aGlzLmFhfHwodGhpcy5hYT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYShhKSksdGhpcy51YigpLHRoaXMuSmQoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5LYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLktiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5xZCh0aGlzLnJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VZygpfWVsc2UgdGhpcy5VZygpfSxUZzpmdW5jdGlvbigpe3ZhciBmO3ZhciBjO2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5uYigpKTt0aGlzLmx2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5IZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5yYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMucmI9bnVsbCx0aGlzLkhlKCl9LGx2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7ZSgpJiYKYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0sVWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoKSk7dGhpcy5tdihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLnFkKHRoaXMucmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuTGImJnRoaXMuTGIubGVuZ3RoKXt2YXIgYz10aGlzLkxiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVGcoKX0sbXY6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtoKCkmJmIoKX1mdW5jdGlvbiBlKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gbD8od2luZG93LmNsZWFyVGltZW91dChsKSwhMCk6ITF9dmFyIGw9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChtKXtmKCl9fSxIZTpmdW5jdGlvbigpe3RoaXMuSmI/KHRoaXMuS2UrKyx0aGlzLklhKG5ldyB6KHRoaXMuSmIpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuSWUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5SZygpfSxJZTpmdW5jdGlvbihhKXt0aGlzLnFkKHRoaXMuV2UsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuS2U/dGhpcy5IZSgpOnRoaXMuSWUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlJnKCk6dGhpcy5JZSgiQUFBIil9LFJnOmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKTt0aGlzLkpkKCl9LHViOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMudGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlhlKSk7CnRoaXMuc2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5zZCYmdGhpcy5zZCgpfSxNbzpmdW5jdGlvbigpe2lmKHRoaXMuTmUmJnRoaXMuVnEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sV2c6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsYyxmLGgsRCl7YT1uZXcga2IoYSxiLGMpO2YmJihhLmxoPSEwKTtoJiZlLlRyKCkmJihhLkhmPSEwKTtEJiYoYS5RZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxuZjpmdW5jdGlvbigpe2UuWWEoKXx8ZS5NYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmdjKCl8fChhPXRoaXMuSmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKaC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5oYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sTG86ZnVuY3Rpb24oKXt0aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5JYShhLHRoaXMuJHYuYmluZCh0aGlzKSx0aGlzLlp2LmJpbmQodGhpcykpfSwkdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuY3EoKX0sWnY6ZnVuY3Rpb24oKXt9LGNxOmZ1bmN0aW9uKCl7ZS5aYihrLmJxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxKZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnFiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMucWIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMucWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuTWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLmZjKCldPXRoaXM7ZS5NYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxzdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLkxlfSxIcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxsLGssbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsbD0oZiYxNSk8PDJ8ZT4+NixrPWUmNjMsaXNOYU4oZik/bD1rPTY0OmlzTmFOKGUpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHUseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTQwOzU5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfG4md3xwJncpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBsYj1jLnJqfHxsYixtPW5ldyBsYjt3aW5kb3cudHg9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vdT10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbN107CnRoaXMuRW49dGhpcy5hWzZdO3RoaXMuUXE9dGhpcy5hWzJdO3RoaXMueWs9dGhpcy5hWzVdO3RoaXMudWk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbN119Yy5GaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub3U6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fbjp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUXE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlrOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIG1iPWMuRml8fG1iLFhjPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5udSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmY9YTthLnUuTD90aGlzLk5hPWEudS5MKCk6dGhpcy5OYT0iIjt0aGlzLmNvbnRhaW5lcj10aGlzLmYuVGE7dGhpcy5wbGF5ZXI9dGhpcy5mLnU7dGhpcy5BYj10aGlzLkNjPSExO3RoaXMubm89MUUzO3RoaXMuZGE9bnVsbDt0aGlzLlA9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5vZD17fTt0aGlzLkFjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuQWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5mLnUpJiZ0aGlzLmYudS5CJiYoYT10aGlzLmYudS5CKCkpLHRoaXMuQWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7CnRoaXMubmQ9ITE7dGhpcy5sZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5tPXt9O3RoaXMueWM9ITE7dGhpcy5aZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkRiPSExO3RoaXMuaXA9ZS5wYSgxMCk7dGhpcy5kZD1lLnBhKDEwKTt0aGlzLm1lPWUucGEoMTApO3RoaXMuT2c9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWGI9dGhpcy5rYj0hMTt0aGlzLlFkPW51bGw7dGhpcy5aZD10aGlzLnVlPXRoaXMuS2Q9dGhpcy5NYz10aGlzLkdlPXRoaXMudmc9dGhpcy5RYz10aGlzLnl2PXRoaXMuYWI9ITF9Yy5saj1iO2IucHJvdG90eXBlPXtKZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxYZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuSGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuUC50Yz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQoay5tbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpfSxnZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuUC5hYSl0aGlzLlAuTW8oKSx0aGlzLlAub2EmJnRoaXMuUC5pc0VuYWJsZWQ/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5QLnBjfSkpOmI/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUC5wYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQ2EoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZ2UoYSwKYixjKX0sNTApfX0sc2U6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMTt0aGlzLm09YTt0aGlzLlB1KHRoaXMubSk7dGhpcy5SZihhKX0sUmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMub2Q9dGhpcy5KcShhKSksdGhpcy5SZihhLnBhcmVudCkpfSxKcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWil7Yj1hLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5aLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmCihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZ2E6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLk9jJiZhLk9jLmVycm9yJiZhLk9jLmVycm9yLmNvZGUmJihiPWEuT2MuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5xYy5jb2RlOmI9PUUueGQuY29kZT9lLkQoay50dyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpOihlLmhlKCksYj09RS4kZS5jb2RlJiZlLkQoay5Ucyx0aGlzLm0uUix0aGlzLmYudS5CKCksCnRoaXMuVCgpKSk7ZS5EKGsuYXEsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB4LlllLmNvZGU6ZS5EKGsuYXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LmFmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGsuQXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC55ZC5jb2RlOmUuRChrLkp3LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC53ZC5jb2RlOmUuRChrLlVzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLAp0aGlzLlhifHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLmxhJiYoYys9Il8iK2EuZXJyb3IubGEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5CYihhKTt0aGlzLkNhKCl9LEJiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5BYS5sZW5ndGg7KXRyeXt2YXIgYz1hLkFhLnBvcCgpO3RoaXMuZmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LFB1OmZ1bmN0aW9uKGEpe3RoaXMuS2Q9dGhpcy5aZD10aGlzLnVlPSExO3RoaXMucmE9dGhpcy5mLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmYuQzsKYi5NeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuQW4mJnRoaXMucGxheWVyLlRjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5UYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuTS5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5NW2NdLnR5cGUpJiZ0aGlzLnduKGIsYS5NW2NdLnVybCsiIixhLk1bY10udHlwZSk7dGhpcy5WZyhiKT8odGhpcy55bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmRhPQp0aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5tLmNwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5OdSgpKTp0aGlzLiRkKCk/dGhpcy5MZygpOnRoaXMubS5vcmlnaW4uQmYoeC53ZCl9LE51OmZ1bmN0aW9uKCl7ZS5yZigpO3RoaXMubSYmdGhpcy5tLm9yaWdpbiYmdGhpcy5tLm9yaWdpbi5TZSYmZS56bih0aGlzLm0ub3JpZ2luLlNlKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5mLkM7dGhpcy5mLkM9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuZi5DLGEpO3RoaXMuZi53ZygpOwp0aGlzLmYubGMoKTtmb3IoYT10aGlzLmYuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5mLmxjKCk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5mLkcuYXBwZW5kQ2hpbGQodGhpcy5PKTt0aGlzLk8ub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLkxxKCksYj10aGlzLm0uUi5PcmlnaW5hbEFkUGFyYW1ldGVycywKYz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDphLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTphLmRlc2lyZWRCaXRyYXRlfHxhLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpifSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuZi5HLnN0eWxlLmhlaWdodCl9fX07ZS56YSh0aGlzLk8sImNvbmZpZyIsYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnlvKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuUCk7dGhpcy5PLnNyYz1hO2UuRWQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt3KGEpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMubHcoKSx0aGlzLmYuY2MoITApKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmYuY2MoITApLHRoaXMubncoKSksIkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmNjKCEwKSx0aGlzLnJ3KCkpLCJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB3KCksIkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF3KCksIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coKSwiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3coKSwiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaWgoKSl9LmJpbmQodGhpcykpOwplLkVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcykpO2UuRWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmYudG4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxudzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpfSxsdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIil9LHJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlFhKCJzdGFydCIpfSxwdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtlLlFhKCJmaXJzdFF1YXJ0aWxlIil9LHF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpfSxzdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlFhKCJ0aGlyZFF1YXJ0aWxlIil9LApvdzpmdW5jdGlvbigpe3RoaXMudGQoKTtlLlFhKCJjb21wbGV0ZSIpfSxpaDpmdW5jdGlvbihhKXtpZih0aGlzLk8mJnRoaXMuTy5wYXJlbnROb2RlJiZ0aGlzLk8ucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLlFhKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLk8ucGFyZW50Tm9kZTt0aGlzLk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLk8pO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTt0aGlzLk89ZS5iYT0hMTt0aGlzLkNhKGEpfX0sa3c6ZnVuY3Rpb24oYSl7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLm1lc3NhZ2UsITApO2UuUWEoImVyciIsYS5tZXNzYWdlKTt0aGlzLmloKCEwKX0sd246ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5QO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5nYygpPyhmPWUuSmEoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsCiJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuY3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LHluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhoLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuUGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGg6ZnVuY3Rpb24oYSl7dGhpcy5BYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFifHx0aGlzLlBlKGEpfS5iaW5kKHRoaXMpLHRoaXMubm8pKX0sUGU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuQ2MmJnRoaXMuVmcodGhpcy52aWRlbykmJiF0aGlzLmtiJiYhdGhpcy5BYil7dGhpcy5DYz0hMDt0cnl7aWYoIWUuWWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMubS5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMua2J8fCh0aGlzLmtiPSEwLHRoaXMuaGQodGhpcy52aWRlbyksCmUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuUC5BZnx8dGhpcy5QLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuQ2EoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwiIiwhMCl9dGhpcy5idygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5mLmxjKCk7dGhpcy5laCgpO3RoaXMuZmgoKTt0aGlzLmxmKCk7dGhpcy5mLndnKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZlKCl9fSxGZTpmdW5jdGlvbigpe2lmKCF0aGlzLk1jKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuSGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuWWM9W107Zm9yKHZhciBiPXRoaXMuZi5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlljLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PQoibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMueGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsCmIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhjKCl9ZWxzZSB0aGlzLnhjKCl9LHhjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuWWMpZm9yKHZhciBiPTA7Yjx0aGlzLlljLmxlbmd0aDtiKyspdGhpcy5ZY1tiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5NY3x8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuQ2EoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLnBnKCEwKSx0aGlzLnhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLlpkJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy51ZT0hMH0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5GYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkZiLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LmJpbmQodGhpcyk7dGhpcy5UZCgpLktnKHRoaXMpfSx0ZDpmdW5jdGlvbigpe3RoaXMuUC5ZYiYmIXRoaXMua2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChrLmduLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5DYSgpfSxDYTpmdW5jdGlvbihhKXtpZighdGhpcy5LZClpZih0aGlzLktkPSEwLHRoaXMubS4kYXx8dGhpcy5tLlBiKXt0aGlzLkFiPXRoaXMuQ2M9ITE7dHJ5e3RoaXMuaGQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5uZD0hMTt0cnl7dGhpcy5mLmFoKCl9Y2F0Y2goZSl7fXRoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5EYj0hMTt0aGlzLlRkKCkuRWcoKTt0aGlzLm0uJGEmJnRoaXMubS5vcmlnaW4ubmUoKTt0aGlzLm0uUGImJihhP3RoaXMubS5vcmlnaW4ucWcoKTp0aGlzLkxkKCkpfWVsc2UgdGhpcy5MZCgpfSxjdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuJGQoKT90aGlzLkxnKCk6dGhpcy51ZChhKSl9LHVkOmZ1bmN0aW9uKGEpe3RoaXMuQWI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLiRkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHx0aGlzLlAubmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUC5uZigpKTt0aGlzLm0ub3JpZ2luLkJmKHgud2QpfSxRZTpmdW5jdGlvbigpe2lmKHRoaXMueXYpdGhpcy5DYSgpO2Vsc2V7dGhpcy5EYj0hMDt0aGlzLmYudS5sYiYmIXRoaXMuR2UmJnRoaXMuZi51LmxiKCkmJmUuRChrLktjLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLkR2KGEpO3ZhciBiPSIiO2lmKHRoaXMubS5FZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PZyk7YyYmKGI9dGhpcy5tLkVlLWEsMDxiP2I9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYik6KGI9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKSx0aGlzLm5kfHwodGhpcy5uZD0hMCxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGsubm4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLm0uJGE/KHRoaXMuQWI9dGhpcy5DYz0hMSx0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMubmQ9ITEsdGhpcy5mLmFoKCksdGhpcy5tLm9yaWdpbi5uZSgpKTp0aGlzLkNhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9Yil9dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsZS5JZih0aGlzLm0uZHVyYXRpb24tYSkpKTt0aGlzLnljPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxMZzpmdW5jdGlvbigpe3RoaXMuWGI9ITA7dGhpcy5yYT10aGlzLmYuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuRXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5mLkM9YTt2YXIgYj10aGlzLmYuQyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5mLmxjKCk7dGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyk7dGhpcy5kYS5hcHBlbmRDaGlsZChiKTt0aGlzLmVoKCk7dGhpcy5maCgpO3RoaXMuUWQ9c2V0SW50ZXJ2YWwodGhpcy5Lby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMubS5NLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5tLk1bY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUDtoLm9hJiZoLmlzRW5hYmxlZCYmIWguZ2MoKSYmKGU9aC5KYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LEtvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLm0uZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5RZCksdGhpcy50ZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLlFlKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLlFkKSwKdGhpcy51ZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFlnOmZ1bmN0aW9uKCl7dGhpcy52Z3x8KHRoaXMudmc9ITAsdGhpcy5RY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LER2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuWmd8fHRoaXMua2J8fCgwPT1hJiYodGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSksdGhpcy51ZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5aZD0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5ZZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuWWcoKX0uYmluZCh0aGlzKSksCnRoaXMuWGImJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLmtifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS5EKGsuam4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLkQoay5wbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWGImJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5ZYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuUWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQoay5obix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxhPT0KTWF0aC5mbG9vcih0aGlzLm0uZHVyYXRpb24vMikmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUuRChrLmxuLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLm0uZHVyYXRpb24vNCkmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLkQoay5ybix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxlLkQoay5zbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWmc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMua2Ipe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9CnRoaXMuS3EodGhpcy5tLkFhLGEpO2MubGVuZ3RoOyl0cnl7dmFyIGY9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMub2QuaW1wcmVzc2lvbnMmJmUuUnIoZi51cmwsdGhpcy5vZC5pbXByZXNzaW9ucyk/dGhpcy5mZShmLnVybCxmLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5EKGsua24sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpLHthZElkOnRoaXMub2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9KX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmZlKGYudXJsLGYudHlwZSl9Y2F0Y2goaCl7fWJ8fCh0aGlzLm0uQWE9dGhpcy5ycCh0aGlzLm0uQWEsYSkpfX0sZmU6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5QLkdhKGEpLGMmJmEudm4oYyksZnx8KGY9dGhpcy56ZiksdGhpcy5QLklhKGEsZix0aGlzLnpmLCExLCEwKSl9LEtxOmZ1bmN0aW9uKGEsCmIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHJwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyl9LGdoOmZ1bmN0aW9uKCl7ZS5EKGsuWm8sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7IXRoaXMuUWMmJmUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuc3EoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5tLkhjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMubS5IYywKdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIil9fSxlaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsCmUuSWYoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuUC5FYyYmKGI9dGhpcy5QLkVjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sYWM6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sa2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGZoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5pcDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPQoicmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLmRkO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF2LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2MuaWQ9dGhpcy5tZTtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnp2LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTsKZi5pZD10aGlzLk9nO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLm0uRWUmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz0KdGhpcy5kYS5hcHBlbmRDaGlsZChhKTt0aGlzLmYudS52YSYmdGhpcy5mLnUudmEoKSYmdGhpcy5wZygpO3RoaXMuYmMoKX19LGJjOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbGQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sQXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTt0aGlzLmYuQy5wYXVzZWQ/KHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSk6KHRoaXMuZi5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQoay5mZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTsKdGhpcy5mLkMucGF1c2VkfHwodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmZmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSx3dTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZCYmKHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LHp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tZSk7dGhpcy5mLkMubXV0ZWQ/KHRoaXMuZi5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOgoodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxwZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWUpO3RoaXMuZi5DLm11dGVkfHwodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxGYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5GYik7dGhpcy5NY3x8dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LApMZDpmdW5jdGlvbigpe3RoaXMuTWM9ITA7dGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5IYSYmdGhpcy55Y3x8InBvc3Ryb2xsIj09ZS5IYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuZi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmYubGMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpOwpiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTWQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5NZCgpfWVsc2UgdGhpcy5NZCgpfSxNZDpmdW5jdGlvbigpe3RoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5mLnh1KCk7dGhpcy5EYj0hMTtlLkQoay5ocCx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMuVGQoKS5FZygpfSxUZDpmdW5jdGlvbigpe3ZhciBhPQpudWxsO3RoaXMuZiYmdGhpcy5mLnUmJihhPXRoaXMuZi51KTtyZXR1cm4gYX0sJGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxsZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLmJnKHRoaXMudmlkZW8sYSk/dGhpcy53dSgpOnRoaXMucWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGYoKX0uYmluZCh0aGlzKSwxMDApKX0sVDpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMubSYmKGEuY2xpY2t0aHJvdWdoPXRoaXMubS5IYywKYS5kdXJhdGlvbj10aGlzLm0uZHVyYXRpb24sYS5hZFBvZD10aGlzLm0uJGEsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSx6ZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5sanx8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbT10aGlzLmFbNl07dGhpcy5Mdj10aGlzLmFbM107dGhpcy5hcD10aGlzLmFbN107dGhpcy5VdD10aGlzLmFbM107dGhpcy5tcT10aGlzLmFbM107dGhpcy5LaD10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLmJwPWI7Yi5wcm90b3R5cGU9e2RtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbTp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHY6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5hcDp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVXQ6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1xOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2g6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLmJwfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5kbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkxhPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUWI9dGhpcy5SYj0hMTt0aGlzLlNlPSIiO3RoaXMuUmU9ITE7ZCYmZC5lbXB0eT90aGlzLnVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLnRtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLndmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS50Zih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5wZChhKSkrIiZ0eXBlPWpzIiwKYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy50cy5iaW5kKHRoaXMpLHRoaXMucXMuYmluZCh0aGlzKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09CmUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5MYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYKInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6LTF9KTtyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3RoaXMubXUoYSk7dHJ5e3RoaXMuTGE9YS5yZXNwb25zZVhNTCx0aGlzLkxhfHwodGhpcy5MYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5KZigpO3RoaXMuUmI9dGhpcy5KZSgpO3RoaXMuUWI9dGhpcy5TZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnFjLHtlcnJvcjp0aGlzLlJlP0UueGQ6RS5aZX0pKX0sdXM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTGF8fCh0aGlzLkxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPXRoaXMuSmYoKTt0aGlzLlJiPXRoaXMuSmUoKTt0aGlzLlFiPXRoaXMuU2coKTt0aGlzLlcubGVuZ3RoP3RoaXMuaWMoKTp0aGlzLmdhKHRoaXMuRGEoeC5xYywKe2Vycm9yOnRoaXMuUmU/RS54ZDpFLlplfSkpfSxxczpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlllLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLldyKCk/dGhpcy5udigpPyhhKyssbmV3IGIodGhpcyx0aGlzLlNmKCksZyx7QWRTeXN0ZW06dGhpcy5xcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5hZikpOihhPTAsdGhpcy5YdigpJiZ0aGlzLnNlKHRoaXMua3AoKSkpfSxuZTpmdW5jdGlvbigpe3RoaXMuUmI/KHRoaXMuUmI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQubmUoKX0scWc6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLlFiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLmljKCkpOnRoaXMucGFyZW50LnFnKCl9LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3YoKT90aGlzLmp2KCk/ITA6KC0xIT10aGlzLiRiKCk/CnRoaXMuZ2EodGhpcy5EYSh4LlVlKSk6dGhpcy5nYSh0aGlzLkRhKHguaGkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnFjLEUuJGUpKSwhMSl9LHNlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5qZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlJiO2EuUGI9YS5QYj9hLlBiOnRoaXMuUWI7dGhpcy5wYXJlbnQuc2UoYSl9LGtwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy4kYigpO2EuTT10aGlzLk9mKCk7YS5IYz10aGlzLnRxKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5wcSgpO2EuRWU9dGhpcy5JcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguVWUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLnZxKCkpOmIuQWEuY29uY2F0KHRoaXMuQ3EoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5CYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LkJiJiYKdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0sQmY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxrdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2YoKS5sZW5ndGh9LGp2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy4kYigpfSxKZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuSmUoKSYmKGE9ITApO3JldHVybiBhfSxtdTpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuU2U9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLlJlPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFdyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5TZigpLmxlbmd0aH0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxxcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNkKHRoaXMuWiwiQWRTeXN0ZW0iKX0samU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwiRXJyb3IiXSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0KYS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx0cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxPZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLApEYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iikscng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSxwcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7CmEmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5XYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sJGI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LElxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLApkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxVZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5XYyhhKToiIn0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBVPWMudG18fFU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmtxPXRoaXMuYVs3XTt0aGlzLkNwPXRoaXMuYVs5XTt0aGlzLk1wPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HbDp0aGlzLmpxKGEpfSxqcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3E6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkNwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW46dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5odXx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkZsKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMuSGM9IiI7dGhpcy5SPXRoaXMuUGI9dGhpcy4kYT0hMTt0aGlzLm9yaWdpbj1udWxsfWMubWw9YjtiLnByb3RvdHlwZT17Y3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9CnRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBvYj1jLm1sfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMTBdO3RoaXMuVG49dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzNdO3RoaXMuZXY9dGhpcy5hWzZdO3RoaXMuams9dGhpcy5hWzVdO3RoaXMuaGo9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbNl19Yy5xbz0KYjtiLnByb3RvdHlwZT17enI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFyOnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ubjp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWk6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Mczp0aGlzLmR2KGEpfSxkdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXY6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmprOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5oajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMucW98fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLnpyKDQpOwp2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGhpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxxYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxhZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFllOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCmd4Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxVZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17WmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sJGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0saXg6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRnQ9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzhdO3RoaXMudmg9dGhpcy5hWzZdO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbN119Yy5ndD1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnQ6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZbTp0aGlzLnVoKGEpfSx1aDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmg6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlB0OnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXQ6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBzYj1jLmd0fHxzYixhZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQuRXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5PYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLlJpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5SaXx8cGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMuWGo9dGhpcy5hWzFdO3RoaXMuR3I9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuQXA9dGhpcy5hWzhdO3RoaXMueXc9dGhpcy5hWzNdO3RoaXMuZHg9dGhpcy5hWzddO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLlJvPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsyXX1jLkNpPWI7Yi5wcm90b3R5cGU9CntDaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGg6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3I6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNqOnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lajp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnl3OnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5keDp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaGw6dGhpcy5RbyhhKX0sUW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sbzp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciB0Yj1jLkNpfHx0YixiZD1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5DaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlRhPWEuS2YoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuZmc9ITE7dGhpcy5kYz1bXX1jLnNpPWI7Yi5wcm90b3R5cGU9e0dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCwKZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdxKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5QcihhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sJHU6ZnVuY3Rpb24oKXt0aGlzLmZnPSEwfSxhaDpmdW5jdGlvbigpe3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sd2c6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQoay5LYyx0aGlzLnUuQigpKX0seHU6ZnVuY3Rpb24oKXt0aGlzLmZnfHwodGhpcy51LnBsYXkoKSxlLkQoay5MYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYKKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5UYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlRhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuVGEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5HYiYmdGhpcy51LkdiKCk/dGhpcy51LktmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2MuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LFByOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGNjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudXEodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHwKYi5wb3NpdGlvbiE9dGhpcy5VYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5VYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuVWEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuVWEud2lkdGgmJjA8dGhpcy5VYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLldkKCk7cmV0dXJufXRoaXMuVWE9Yjt0aGlzLnUuR2IoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5jYy5iaW5kKHRoaXMpLDEwKX0sdG46ZnVuY3Rpb24oYSl7dGhpcy5kY3x8KHRoaXMuZGM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmRjLnB1c2goYSl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zaXx8TyxDPVtdLHViPTA7MTAwPnViO3ViKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixCKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdD10aGlzLmFbN107dGhpcy5Haz10aGlzLmFbNF07dGhpcy53dj10aGlzLmFbMl07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbNV19Yy56dD1iO2IucHJvdG90eXBlPXtDdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRHQ6dGhpcy5GayhhKX0sRms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdrOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Y6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkttOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6CnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgdmI9Yy56dHx8dmIsY2Q9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2QuQ3QoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuUyhhKTt0aGlzLkRlKGIpO3RoaXMueGYoKX0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5FYSgpLGE9dGhpcy52aWRlb1RhZzthfHwKKChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlUoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhmKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LCRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkVhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgd2I9Yy5aa3x8d2I7KGZ1bmN0aW9uKGMpe2MuWWs9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy55Yj10aGlzLnlifHwhMTt0aGlzLmVmPXRoaXMuaGY9dGhpcy5YZj10aGlzLmphPXRoaXMuTWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5mcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELAoiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk1lPSEwO3RoaXMuWGYmJnRoaXMucWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLkRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLlhmPSEwO3RoaXMucWYoKX0uYmluZCh0aGlzKSk7dGhpcy5tZigpfSxxZjpmdW5jdGlvbigpe2lmKCF0aGlzLnliKXt0aGlzLkZjKCk7aWYoIXRoaXMuTWUmJiF0aGlzLkZjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5NZSYmdGhpcy5lZiYmIXRoaXMuaGYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLAoxMDApfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LFBmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LG1mOmZ1bmN0aW9uKCl7aWYodGhpcy5GYygpKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuaGY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5lZj1iLm54fXRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1mKCl9LmJpbmQodGhpcyksMTAwKX0sdXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh4KCk6ITF9LCRiOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi4kYigpOi0xfSxEcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxmcTpmdW5jdGlvbihiLGEpe3RoaXMueWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy55Ynx8MzAyPT10aGlzLnliP3RoaXMuamE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnliKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfSxKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT8odGhpcy5vKCksdGhpcy5uYSgpKTpiLiRjKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLkRxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHhiPWMuWWt8fHhiOyhmdW5jdGlvbihjKXtjLiRrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sVXI6ZnVuY3Rpb24oKXt3aW5kb3cuT08ucWwuYW4uWm0/d2luZG93Lk9PLnFsLmFuLlptLmx4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVyKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLnhhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRmEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyB3YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgeGIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHliPWMuJGt8fHliLHpiPW5ldyB5YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbNV07dGhpcy5YbD10aGlzLmFbNF07dGhpcy5ieD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs4XX1jLllxPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhsOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ieDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6CnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NaDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuWXF8fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlhyKDQpOyhmdW5jdGlvbihjKXtjLk5sPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEdiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5ObHx8VjsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LkRkKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS5EZCgiIyIrYiwiYWRzTWFuYWdlckxvYWRGYWlsIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksCjFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5kdChhKX0uYmluZCh0aGlzKSk7eS5VcSgpfSxkdDpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufX10aGlzLmwoImFkZXJyb3IiLGEpO3RoaXMudygpfX0pfSkoYyk7dmFyIFc9Yy5NbHx8VzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUud3AoYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuSChkKSl7dGhpcy5KKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5BKTtmLmIoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxoPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5jZHx8Cih0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxvdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLmhjfHwodGhpcy5oYz1bXSksdGhpcy5oYy5wdXNoKGIpLHRoaXMudnUoKSYmKHRoaXMuRmcoKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LFVxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkub3YoYil9fSl9KShjKTt2YXIgQmI9Yy5PbHx8QmIseT1uZXcgQmIocSk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHQ9dGhpcy5hWzFdO3RoaXMuYW09dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzNdO3RoaXMuZnQ9dGhpcy5hWzJdO3RoaXMuZm89dGhpcy5hWzddO3RoaXMuR209dGhpcy5hWzVdO3RoaXMueGw9dGhpcy5hWzNdO3RoaXMuemw9dGhpcy5hWzRdO3RoaXMuYnI9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbNV19Yy5wdj1iO2IucHJvdG90eXBlPXtLdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTHQ6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XbTp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnQ6dGhpcy5lbyhhKX0sZW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mbzp0aGlzLkZtKGEpfSxGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206CnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bDp0aGlzLnlsKGEpfSx5bDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuemw6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJyOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5wdnx8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuV2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLldofHxEYjsoZnVuY3Rpb24oYyl7Yy5YaD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuYXV8fCh0aGlzLmF1PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlhofHwKRWI7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRmI9Yy5ZaHx8RmIsR2I9bmV3IEZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNpPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsyXTt0aGlzLnFyPXRoaXMuYVs5XTt0aGlzLkZzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzZdfWMuTG49YjtiLnByb3RvdHlwZT17Ymk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNpOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucXI6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5Mbnx8SGIsZmQ9bmV3IEhiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLmJpKDQpOyhmdW5jdGlvbihjKXtjLnltPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMueW18fEliOyhmdW5jdGlvbihjKXtjLnhtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMua2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLm9xfHwodGhpcy5ZZigpLAp0aGlzLm9xPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm8oKTp0aGlzLmtmPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMucygpKToodGhpcy5rZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sWWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnJxKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZZigpfS5iaW5kKHRoaXMpLDUwKX0sRng6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueG18fEpiOyhmdW5jdGlvbihjKXtjLnptPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEtiPWMuem18fEtiLExiPW5ldyBLYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Faz10aGlzLmFbOV07dGhpcy5Sdj10aGlzLmFbMTBdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMudXY9dGhpcy5hWzVdO3RoaXMub3Q9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbNl19Yy5Xbz1iO2IucHJvdG90eXBlPXtEazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWs6dGhpcy5RdihhKX0sUXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sdjp0aGlzLmttKGEpfSxrbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG06dGhpcy50dihhKX0sdHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnV2OnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciBNYj1jLldvfHxNYixnZD1uZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1nZC5Eayg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpOwpiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgTmI9Yy5aanx8TmI7KGZ1bmN0aW9uKGMpe2MuWWo9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuamgoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLkdmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLApmdW5jdGlvbigpe3RoaXMuR2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMucW4oKX0uYmluZCh0aGlzKSksdGhpcy5raD0hMSx0aGlzLnd3PTFFMyx0aGlzLnlnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxHZjpmdW5jdGlvbigpe3RoaXMueWcuZG9uZXx8KHRoaXMueWcuZG9uZT0hMCx0aGlzLmtoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qaCgpfS5iaW5kKHRoaXMpLHRoaXMud3cpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2gpO3RoaXMubygpfSxqaDpmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sTWY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHdhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5NZihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLk1mKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLllqfHxPYjsoZnVuY3Rpb24oYyl7Yy4kaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmCndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBQYj1jLiRqfHxQYixRYj1uZXcgUGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLkhzPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVs4XTt0aGlzLlZ1PXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzRdfWMuJHA9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZHI6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZ1OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgUmI9Yy4kcHx8UmIsaGQ9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLlR3KDQpOyhmdW5jdGlvbihjKXtjLklsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBTYj1jLklsfHxTYjsoZnVuY3Rpb24oYyl7Yy5IbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLAphKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpO3RoaXMuVmIoKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5jZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwKMTApfSxjZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgVGI9Yy5IbHx8VGI7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJgohd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLkpsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzRdO3RoaXMudnc9dGhpcy5hWzEwXTt0aGlzLkNrPXRoaXMuYVs0XTt0aGlzLlFrPXRoaXMuYVs2XTt0aGlzLlZoPXRoaXMuYVsyXTt0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLlhuPXRoaXMuYVsyXTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzVdfWMuZmo9YjtiLnByb3RvdHlwZT17VW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQ246dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZ3OnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dazp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWs6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZoOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5XbihhKX0sV246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhuOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMuZmp8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PQppZC5Vbyg0KTsoZnVuY3Rpb24oYyl7Yy5CbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuUyhiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy50ZT0hMX0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZHUoKX0uYmluZCh0aGlzKSw1MDApfSxkdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7CnJldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy50ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50ZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFh1OmZ1bmN0aW9uKCl7dGhpcy50ZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBYYj1jLkJsfHxYYjsoZnVuY3Rpb24oYyl7Yy5BbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuTmI9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk5ifHwodGhpcy5OYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsCiJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk5ifHx0aGlzLk5iKyssdGhpcy5OYjw9dGhpcy5Kcz8odGhpcy5OYisrLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSl9LHM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlh1KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBZYj1jLkFsfHxZYjsoZnVuY3Rpb24oYyl7Yy5DbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSwKdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWWIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBaYj1jLkNsfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUWk9dGhpcy5hWzNdO3RoaXMuQmg9dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVs5XTt0aGlzLlBuPXRoaXMuYVszXTt0aGlzLnVyPXRoaXMuYVs0XTt0aGlzLlpsPXRoaXMuYVsxXTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVs0XX1jLm9tPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RaTp0aGlzLkFoKGEpfSxBaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQmg6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRoOnRoaXMuUXUoYSl9LApRdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnU6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBuOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51cjp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWmw6dGhpcy5IcChhKX0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLklwOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIGFjPWMub218fGFjLGpkPW5ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLlBpKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT0KdGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBiYz1jLnNsfHxiYzsoZnVuY3Rpb24oYyl7Yy5ybD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBiKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuZXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuVmMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm1zKCk6dGhpcy5WYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZigpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5kZigpfHx0aGlzLnMoITApfSxtczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmMoKTshYi5tYSYmYi5XJiZiLmt4JiZiLm14JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlZjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwxMDApfSxWYzpmdW5jdGlvbigpe2lmKCF0aGlzLnVnKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy51Zz1iW2NdKTtyZXR1cm4gdGhpcy51Z30sY2U6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuVmMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKToKdGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNjPWMucmx8fGNjOyhmdW5jdGlvbihjKXtjLnRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGJjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBjYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBkYz1jLnRsfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmNtPXRoaXMuYVsxMF07dGhpcy51bz10aGlzLmFbOV07dGhpcy5CdD10aGlzLmFbN107dGhpcy5jbz10aGlzLmFbNV07dGhpcy5Haj10aGlzLmFbMTBdO3RoaXMucmg9dGhpcy5hWzVdO3RoaXMuY3M9dGhpcy5hWzFdO3RoaXMuaXE9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbMl19Yy5Fcj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY206dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVvOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CdDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucmg6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNzOnRoaXMuaHEoYSl9LApocTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaXE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLkVyfHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5ibSg0KTsoZnVuY3Rpb24oYyl7Yy5xaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hPwp0aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7CmIhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5xa3x8WDsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy52ZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnZlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMudmUmJmIhPXRoaXMudmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5KeCksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLnBrfHxZOyhmdW5jdGlvbihjKXtjLnJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFkoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5GZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLnJrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuS3UoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUua2cuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlsW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLmtnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVHA9dGhpcy5hWzZdO3RoaXMuT209dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzZdO3RoaXMuaT10aGlzLmFbOF19Yy5haj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5ObShhKX0sTm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5PbTp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYz1jLmFqfHxpYyxsZD1uZXcgaWMoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bGQuU3AoNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlMoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5Tcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX0sCkN1OmZ1bmN0aW9uKGIpe3RoaXMuQmQ9Yn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Tc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkJkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5CZCYmKG5ldyBJKHRoaXMsdGhpcy5CZCkpLmIoKSl9fSl9KShjKTt2YXIgTj1jLmdtfHxOOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5SZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuTXUoKTp0aGlzLnMoITApLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlJkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSwKWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuZm18fEk7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuQ3UodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuaG18fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51dD0KdGhpcy5hWzVdO3RoaXMuYXQ9dGhpcy5hWzVdO3RoaXMuenM9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbOV19Yy5Saz1iO2IucHJvdG90eXBlPXt0dDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF0OnRoaXMueXMoYSl9LHlzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56czp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYz1jLlJrfHxsYyxtZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC50dCg0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy51Zj0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmVhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51Zn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3pvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMudWY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCnt6bzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIG1jPWMubmt8fG1jOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE54OmZ1bmN0aW9uKCl7fSxxdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLlRlKG5ldyBmdW5jdGlvbigpe30pO2EuaHg9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IucXUoYSk7d2luZG93LnB4PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLnB1fHwodGhpcy5wdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLllkfHwodGhpcy5ZZD0xKTtpZigyMDx0aGlzLllkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkthKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuWWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEthOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5BZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSl9LFg6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBuYz1jLm1rfHxuYzsoZnVuY3Rpb24oYyl7Yy5vaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbWMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmthfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBuYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgb2M9Yy5va3x8b2MscGM9bmV3IG9jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sbj10aGlzLmFbMV07dGhpcy5Odz10aGlzLmFbN107dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5PcT10aGlzLmFbMV07dGhpcy5Zbz10aGlzLmFbNV07dGhpcy5hcz10aGlzLmFbM107dGhpcy53az10aGlzLmFbNl07dGhpcy5qbD10aGlzLmFbM107dGhpcy5Vdj10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVsxMF19Yy5OcD1iO2IucHJvdG90eXBlPXtRbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJuOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnc6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklrOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PcTp0aGlzLlhvKGEpfSxYbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW86dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFzOgp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLlR2KGEpfSxUdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVXY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBxYz1jLk5wfHxxYyxuZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Rbig0KTsoZnVuY3Rpb24oYyl7Yy5kaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVShhKTthJiZ0aGlzLlMoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLmRrfHxaOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlVmPTA7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPXRoaXMuZWM9dGhpcy5YYT10aGlzLkJjPSExO3RoaXMuQ2c9ZS5uYigxMCk7dGhpcy5jZygpfSxjZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT0KYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkthKCksITA7dGhpcy5VZisrO2lmKDEwPHRoaXMuVWYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLDEwMCksITF9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiYKZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PQphLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7CmJyZWFrfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuY2t8fGFhOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0KMDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIHJjPWMuZWt8fHJjLHNjPW5ldyByYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbMl07dGhpcy50aj10aGlzLmFbNl07dGhpcy5Qdz10aGlzLmFbN107dGhpcy5GaD10aGlzLmFbMTBdO3RoaXMuSWg9dGhpcy5hWzRdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMud2k9CnRoaXMuYVsxMF07dGhpcy5TbT10aGlzLmFbOV07dGhpcy5tdD10aGlzLmFbM107dGhpcy5Scz10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbMl19Yy52dD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXI6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMuT3coYSl9LE93OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qdzp0aGlzLkVoKGEpfSxFaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZoOnRoaXMuSGgoYSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaDp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndpOnRoaXMuUm0oYSl9LFJtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TbTp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXQ6CnRoaXMuUXMoYSl9LFFzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRjPWMudnR8fHRjLG9kPW5ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLmxyKDQpOyhmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSwkYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdWM9Yy5UaXx8dWM7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLApmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5zKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgdmM9Yy5TaXx8dmM7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB1YyhkKSxkLmthfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB2YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciB3Yz1jLlVpfHx3Yyx4Yz1uZXcgd2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuam09dGhpcy5hWzNdO3RoaXMuTm49CnRoaXMuYVs3XTt0aGlzLnl0PXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVs4XTt0aGlzLnpoPXRoaXMuYVs3XTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLmhrPXRoaXMuYVs5XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmFvPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMucm89YjtiLnByb3RvdHlwZT17aW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmptOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueXQ6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMueWgoYSl9LHloOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aDp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSXI6dGhpcy5nayhhKX0sZ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhrOnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubmk6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgeWM9Yy5yb3x8eWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuaW0oNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHpjPWMuWGl8fHpjOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLm9mKCl9LG9mOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5XaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyB6Yyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5rYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkgoYikpe3RoaXMuSihiKTsobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5ZaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkduPXRoaXMuYVs5XTt0aGlzLmx1PXRoaXMuYVs0XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLklpPXRoaXMuYVsxMF07dGhpcy52aj10aGlzLmFbOF07dGhpcy5rcj10aGlzLmFbMV07dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Saj10aGlzLmFbOF07dGhpcy5NaT10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs2XX1jLnlwPWI7Yi5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuR246dGhpcy5rdShhKX0sa3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmx1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSWk6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3I6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNyOnRoaXMuUWooYSl9LFFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Sajp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRGM9Yy55cHx8RGMscWQ9bmV3IERjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLkZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmVnPXRoaXMuaGc9dGhpcy5nZz0hMTt0aGlzLmVkPVtdO3RoaXMueWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIENjP251bGw6Q2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHNjP251bGw6c2MsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFVhP251bGw6VWEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBaYT9udWxsOlphLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOgplYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgaGM/bnVsbDpoYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgR2I/bnVsbDpHYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yz9udWxsOnhjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaWI/bnVsbDppYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBQYT9udWxsOlBhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFhP251bGw6cWF9fWMub2w9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5GcShhKTpbXSxiO3RoaXMuaGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2c9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuR2coYil9ZWxzZSBmb3IoYyBpbiB0aGlzLnllKXtpZih0aGlzLmVnKWJyZWFrO2I9dGhpcy55ZVtjXTt0aGlzLk9lKGIpJiYodGhpcy5lZC5wdXNoKGIpLHRoaXMuR2coYikpfX0sT2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxGcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjOwppZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMueWVbY10sdGhpcy5PZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxHZzpmdW5jdGlvbihhKXt0aGlzLk9lKGEpJiZhLmIoKX0sWnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdnKWZvcih0aGlzLmVnPSEwLGE9MDthPHRoaXMuZWQubGVuZ3RoO2ErKyl0aGlzLmVkW2FdLnRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWRbYV0udGIpfX19KShjKTt2YXIgRWM9Yy5vbHx8RWMsTD1uZXcgRWM7TC5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzFdO3RoaXMuUnQ9dGhpcy5hWzRdO3RoaXMuZ3I9dGhpcy5hWzVdO3RoaXMuTnQ9dGhpcy5hWzldO3RoaXMuYWk9dGhpcy5hWzNdO3RoaXMuYms9dGhpcy5hWzEwXTsKdGhpcy5CdT10aGlzLmFbNF07dGhpcy55cj10aGlzLmFbOV07dGhpcy5PaD10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVs5XX1jLmJuPWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5naTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5OdDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWk6dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJrOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CdTp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueXI6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9oOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEZjPWMuYm58fEZjLHJkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLmZpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlpiKGsuWXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5aYihrLlZzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ry53aWR0aD0xO0cuaGVpZ2h0PTE7Ry5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEcpO3ZhciBzZD1HLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5mYygpO0guWmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5aZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csCkguSnIoKSx7aWQ6dGR9KX0sNTAwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZ4PXRoaXMuYVsyXTt0aGlzLkV3PXRoaXMuYVsxXTt0aGlzLm9zPXRoaXMuYVs5XTt0aGlzLk9pPXRoaXMuYVs1XTt0aGlzLlhwPXRoaXMuYVs5XTt0aGlzLlpuPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzEwXX1jLlN3PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5meDp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXc6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9zOnRoaXMuTmkoYSl9LE5pOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PaTp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5abjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIEdjPWMuU3d8fEdjLHVkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLmV4KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5BZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuYWQ9MDt0aGlzLk5hPSIiO3RoaXMuZmQ9W107dGhpcy5nZD0wO3RoaXMuQmc9ITE7dGhpcy53ZT1bXX1jLm9oPWI7Yi5wcm90b3R5cGU9e0p1OmZ1bmN0aW9uKGEpe3RoaXMuQWc9YX0samQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFdTpmdW5jdGlvbihhKXt0aGlzLldhPWF9LER1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxrYzpmdW5jdGlvbihhLGIpe2UuamIoIndlbHQuZGUiKSYmZS5NYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5XYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLk5yKCkpdGhpcy5XYS5jKHRoaXMuV2EuWGMsdGhpcy5XYS5CYSx0aGlzLldhLnhlLGZ1bmN0aW9uKCl7dGhpcy5rYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLldhLk5jKTtlbHNlIGlmKHRoaXMuV3EoKSl0aGlzLnp1KGZ1bmN0aW9uKCl7dGhpcy5rYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuJHUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLkpnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklzKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5lZSYmKGM9dGhpcy5wbGF5ZXIuZWUoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZ2UoYSwKYyxmKTt0aGlzLnBsYXllci5LZyhsKX19LE5yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuYWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5hZC5nZXRUaW1lKCksdGhpcy5hZD1hLDNFNTxiPyEwOiExO3RoaXMuYWQ9YTtyZXR1cm4hMX0sVHU6ZnVuY3Rpb24oKXtlLkNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQ2YoYSkpP3RoaXMua2MoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGsuTGMsdGhpcy5wbGF5ZXIuQigpKSl9LFN1OmZ1bmN0aW9uKGEpe2UuQ2UoInBvc3Ryb2xsIik7aWYoIXRoaXMuQWcpe3RoaXMuSnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLkNmKGMpKT90aGlzLmtjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5MYyx0aGlzLnBsYXllci5CKCkpKX19LENmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxzdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk91KHRoaXMuU3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZmEoKX0sbWQ6ZnVuY3Rpb24oYSl7ZS5DZSgibWlkcm9sbCIpO2lmKCF0aGlzLm1nKXt0aGlzLm1nPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmtjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChrLkxjLHRoaXMucGxheWVyLkIoKSkpfX0scnU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5JdSh0aGlzLm1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmtlKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlR1KCk7dGhpcy5wbGF5ZXIua2UmJnRoaXMucnUoKTt0aGlzLnN1KCl9LHR1OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuZmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLlZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5nZD10aGlzLmZkLmxlbmd0aH0sV3E6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLmdkJiYoYT0hMCk7cmV0dXJuIGF9LHp1OmZ1bmN0aW9uKGEpe3RoaXMuQmc9YTtmb3IoYT0wO2E8dGhpcy5mZC5sZW5ndGg7YSsrKXRoaXMuZmRbYV1bImZ1bmN0aW9uIl0odGhpcy5ndS5iaW5kKHRoaXMpKX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5nZC0tO2EmJnRoaXMud2UucHVzaChhKTswPj10aGlzLmdkJiZ0aGlzLkJnKCl9LElzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLndlLmxlbmd0aDtjKyspYj10aGlzLndlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBoYT1jLm9ofHxoYSxTPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxMF07dGhpcy5saT10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVszXX1jLmZrPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLk52OnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5saTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZmt8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLk12KDQpfSkuY2FsbChhaXRoYWlOZ0llYmVpbG9vLGFpdGhhaU5nSWViZWlsb28pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.65.40 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.40.65.243.136.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
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/
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
Tue, 27 Nov 2018 15:48:14 GMT
Last-Modified
Mon, 03 Sep 2018 14:21:38 GMT
Server
openresty/1.13.6.2
ETag
"5b8d4372-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
/
ssl.1.damoh.golem.de/8916d6d31a13ee88f5cb03f7f67973d72dd5051f/
110 B
672 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/8916d6d31a13ee88f5cb03f7f67973d72dd5051f/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGFpdGhhaU5nSWViZWlsb289YWl0aGFpTmdJZWJlaWxvb3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kucGV8fCh5LnBlPTApO3kucGUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5wZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBCKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQik7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvdW5tdXRlMTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmwuc2tpcGFibGVCdXR0b258fChsLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjc7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQgaW4gW3RpbWVdczxkaXY+Jyk7bC5za2lwQnV0dG9ufHwobC5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAzMHB4O2Rpc3BsYXk6IGlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyIgb25lcnJvcj1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvc2tpcDE4MTAwMi5wbmdcJyBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGwuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307bC5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLk1hKGEsYixbXSxjLGMsbSl9KX1tLmMobC5nbG9iYWxDb25maWcsbC5jbGllbnRDb25maWcsbC5wcmVjaGVja2VkLGwub25SZWFkeSxsLm9uRmFpbHVyZSxsKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1sLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZmEoZWEsNTApfWZ1bmN0aW9uIGdhKGMsYil7Ynx8KGI9InByZSIpO2lmKGwmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTyhjKSxhPW5ldyBQKGEsbSksZz1sLmFkVGFnOyJwcmUiPT1iJiZsLnByZXJvbGxBZFRhZyYmKGc9bC5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmbC5wb3N0cm9sbEFkVGFnJiYoZz1sLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5KZyhsKSxhLmdlKGcpKX1lbHNlIGZhKGZ1bmN0aW9uKCl7Z2EoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihlLnhvKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UuRChrLktjLGMuQigpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYT1jLmdldEN1cnJlbnRUaW1lKCk7YSYmZS50cmFjaygiYWN0aXZhdGVkQXQiLGEpfWI/bS5vYT0hMDplLnRyYWNrKCJzdGF0c19oZF9hYmQiLCIiLCEwKTthPW5ldyBoYTthLmpkKGMpO2EuRXUobSk7YS5EdShsKTthLnR1KCk7YS5iKCl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubGs9dGhpcy5hWzldO3RoaXMuSnY9CnRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLkxsPXRoaXMuYVsxXTt0aGlzLmN2PXRoaXMuYVszXTt0aGlzLm1wPXRoaXMuYVs0XTt0aGlzLmk9dGhpcy5hWzddfWMuU3Y9YjtiLnByb3RvdHlwZT17a2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmxrOnRoaXMuSXYoYSl9LEl2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Kdjp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG86dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuS2woYSl9LEtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTGw6dGhpcy5idihhKX0sYnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmN2OnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5tcDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpOwp2YXIgaWE9Yy5Tdnx8aWEsSWM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SWMua2soNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMueG89ITE7dGhpcy5IYT0ic2V0dXAiO3RoaXMubWM9W107dGhpcy5yZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLmZ1LmJpbmQodGhpcykpfWMubmo9YjtiLnByb3RvdHlwZT17cmY6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sem46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0sCnBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLCIqIil9LHphOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxmdTpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5ldShhLmRhdGEpfSxldTpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZhLmV2ZW50PT10aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0ubmFtZSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyW2RdLmNiKGEpfSxFZDpmdW5jdGlvbihhLGIpe3RoaXMuYmEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsCmNiOmJ9KX0sdGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy55cShhKSxkPSExO2lmKGIpcmV0dXJuIGE9YS5yZXBsYWNlKGIsIiIpKyIvZGV2L2hvbWFkX3VybC8iK2IrIi8iLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuamcoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx5cTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYKKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0seG46ZnVuY3Rpb24oYSxiKXtpZihhPT1iKXtpZihlLm5xKGEpKXJldHVybjsoYj10aGlzLnRmKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfSxucTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5iYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxFZjpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pOwpyZXR1cm4gYn0sUWE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxWcjpmdW5jdGlvbihhKXtyZXR1cm4iYWJvdXQ6YmxhbmsiPT1hfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxGYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LExmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxZdTpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSwKYWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxiZzpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciB0PWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXQpcmV0dXJuITE7Yz10LmhlaWdodCp0LndpZHRoO2Q9dC53aWR0aDtmPXQuaGVpZ2h0OwowPnQudG9wJiYoZis9dC50b3ApO3QuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZi09dC5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dC5sZWZ0JiYoZCs9dC5sZWZ0KTt0LnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXQucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0sbmI6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrCi4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxWZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZjtpZigwPT09YS5sZW5ndGgpcmV0dXJuIGI7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gYn0sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgZz0iIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsZys9Zi50b1N0cmluZygxNik7cmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHQ9NDAyMzIzMzQxNyxBPTI1NjIzODMxMDIsbD0yNzE3MzM4NzgsCm09MzI4NTM3NzUyMCxuLGssdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSxwLnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPApwLmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXBbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1kKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2M9ZTtuPXQ7az1BO3c9bDtxPW07Zm9yKGY9MDsxOT49ZjtmKyspcj1kKGMsNSkrKG4ma3x+biZ3KStxK2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7Zm9yKGY9MjA7Mzk+PWY7ZisrKXI9ZChjLDUpKyhuXmtedykrcStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSxxPXcsdz1rLGs9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTQwOzU5Pj1mO2YrKylyPWQoYyw1KSsobiZrfG4md3xrJncpK3EraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUscT13LHc9ayxrPWQobiwzMCksbj1jLGM9cjtmb3IoZj02MDs3OT49ZjtmKyspcj1kKGMsNSkrKG5ea153KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dyx3PWssaz1kKG4sMzApLG49YyxjPXI7ZT1lK2MmCjQyOTQ5NjcyOTU7dD10K24mNDI5NDk2NzI5NTtBPUErayY0Mjk0OTY3Mjk1O2w9bCt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihlKStiKHQpK2IoQSkrYihsKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxmLGMsaCxlLHQsQT0wO0E8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KEErKyksZj1hLmNoYXJDb2RlQXQoQSsrKSxjPWEuY2hhckNvZGVBdChBKyspLGg9ZD4+MixkPShkJjMpPDw0fGY+PjQsZT0oZiYxNSk8PDJ8Yz4+Nix0PWMmNjMsaXNOYU4oZik/ZT10PTY0OmlzTmFOKGMpJiYodD02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh0KTtyZXR1cm4gYn0sVHI6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSx3ZjpmdW5jdGlvbigpe3ZhciBhPXt9LGI9ITEsZD0hMSxmPSExLGM9ITEsaD0hMSxlPSExLHQ9ITEsQT0hMSxrPSExLGw9ITE7dHJ5e2I9Y2hlY2tGb3JQaGFudG9tSlMoKX1jYXRjaChuKXt9dHJ5ey9cYkhlYWRsZXNzQ2hyb21lXC8vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJihkPSEwKX1jYXRjaChtKXt9dHJ5e2Y9d2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuc28/ITA6ITF9Y2F0Y2gocSl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksCmU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksaz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSxBPSF0JiYhIXdpbmRvdy5TdHlsZU1lZGlhLGw9KGt8fGMpJiYhIXdpbmRvdy5DU1N9Y2F0Y2gocil7fWEuaXNQaGFudG9tSlM9YjthLmlzQ2hyb21lSGVhZGxlc3M9ZDthLmlzRmlyZWZveEhlYWRsZXNzPWY7YS5pc09wZXJhPWM7YS5pc0ZpcmVmb3g9aDthLmlzU2FmYXJpPWU7YS5pc0lFPXQ7YS5pc0VkZ2U9QTthLmlzQ2hyb21lPWs7YS5pc0JsaW5rPWw7cmV0dXJuIGF9LHNxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy53ZigpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJgooYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxZYTpmdW5jdGlvbigpe3ZhciBhPXtHaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxaaDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxlcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxhbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxCbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sb286ZnVuY3Rpb24oKXtyZXR1cm4gYS5HaCgpfHxhLlpoKCl8fGEuZXIoKXx8YS5hbCgpfHxhLkJtKCl9fTtyZXR1cm4gYS5vbygpfSwKSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQp7fSxkPVtdLGY9MCxjPWEubGVuZ3RoO2Y8YzsrK2YpYi5oYXNPd25Qcm9wZXJ0eShhW2ZdKXx8KGQucHVzaChhW2ZdKSxiW2FbZl1dPTEpO3JldHVybiBkfSxRZjpmdW5jdGlvbihhKXthPXRoaXMuSmEoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxqYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LHdwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LFd1OmZ1bmN0aW9uKGEsCmIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LElmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy4kZyhiKSsiOiIrdGhpcy4kZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPmE/IjAiK2EudG9TdHJpbmcoKTphLnRvU3RyaW5nKCl9LENlOmZ1bmN0aW9uKGEpe3RoaXMuSGE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuSGE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYiwKe2RldGFpbDpkfSk6KGY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZi5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGYpfSxaYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxmLGMpe3ZhciBoPWE7ZCYmYiYmKGI9ay5SYyhiLGQpKTtiJiYoaD1rLlJjKGEsYikpO2YmJihoPWsuUmMoaCxmKSk7YyYmKGg9ay5SYyhoLGMpKTtlLlpiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uYWEpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe2EmJmEudHJpbSYmKGE9YS50cmltKCkpO2ImJmIudHJpbSYmKGI9Yi50cmltKCkpO3ZhciBmPWErYjt0aGlzLm5jfHwodGhpcy5uYz17fSk7dGhpcy5uY1tmXXx8Cih0aGlzLm5jW2ZdPTApO3RoaXMubmNbZl0rKzsxMDx0aGlzLm5jW2ZdfHwoZj1tLnplKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxtLkdhKGYsITApLGY9bS5HYShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIixmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiLGYuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIixtLklhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9ITEpfWNhdGNoKGMpe31mfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSxoZTpmdW5jdGlvbigpe20mJm0uYWE/bS5pc0VuYWJsZWQmJm0uTG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSw1MDApfSxTZDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuVmEoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFVkOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxWYTpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLldjKGEpOiIifSxXYzpmdW5jdGlvbihhKXt2YXIgYj10aGlzLlVkKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sCnlvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuYWUoYSl8fHRoaXMuVnIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LkhnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fHNhbmRib3guSGdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpO2lmKHRoaXMuRWYoYSkpcmV0dXJuIHRoaXMuRWYoYSk7dmFyIGY9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Zi5ob21hZF91cmxfc3VmZml4PWE7Zi5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2YuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtmLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7Zi5ob21hZF92cGFpZF9jb21wYXRpYmxlPQoidHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLk1hKGEsYi51YSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5aYygpLnJlcGxhY2UoIltoYXNoXSIsYy5oYXNoKSk7dGhpcy54bihjLGEpO3JldHVybiBjfSxNYTpmdW5jdGlvbihhLGIsZCxmLGMsaCxlLHQpe3ZhciBrPWh8fG07aD0hMDt0JiYoaD0hMSk7aWYoayYmay5hYSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suR2EoYSxoKTtoPWsuR2EoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1iO2guZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgcSBpbiBkKWguZGF0YVtxXT0KZFtxXTtyZXR1cm4gay5JYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoYSxiLGQsZixjLGssZSx0KX0uYmluZCh0aGlzKSw1MDApfSxqZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgdD0hMDtlJiYodD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZSlkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGVba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWZ8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYixhLHQpLGwud2l0aENyZWRlbnRpYWxzPWgsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLAoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sc3M6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuamcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMubWMpZm9yKHZhciBjIGluIHRoaXMubWMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5tY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UuemIoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YiYmc2V0VGltZW91dChiLDApfS5iaW5kKHRoaXMpLGQpfSxrZzpmdW5jdGlvbihhLGIsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTsKYy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5NYShhLGYudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLnNzKGYuWmMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZiwhMCl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1jPWF9LFZ3OmZ1bmN0aW9uKGEsYixkLGYsYyl7dGhpcy5NYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYj1iLnJlcGxhY2UoIltpZF0iLGQuaWQpLGI9Yi5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxiPWIucmVwbGFjZSgiW2FkdmVydGlzZXJdIiwKZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmZ9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxwbzpmdW5jdGlvbihhKXtmb3IodmFyIGI9ITE7IWI7KXt2YXIgZD1hLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2I9ITA6KGQ9YS5zdWJzdHJpbmcoZCs3LGEuaW5kZXhPZigiKSIsZCkpLAphPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LFJyOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLm5qfHxRO25ldyBRO3ZhciBlPW5ldyBRO3dpbmRvdy5zeD1lOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1qPWI7Yi5SYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYilkW2ZdPWJbZl07Zm9yKGYgaW4gYSlkW2ZdPWFbZl07cmV0dXJuIGR9O2IuU3Q9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVXM9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IudHc9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07CmIuYXE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Kdz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnBuPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLmhuPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5sbj17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5ybj17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuZ249e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Iuam49e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLAptZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuYXc9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlRzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmJxPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Bdz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5abz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLmhwPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07Yi5MYz17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5LYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Iubm49e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLm1uPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5nZj17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuZmY9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Iuc249e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTtiLmtuPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07Yi5Zdj17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLAptZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5Wcz17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBrPWMubWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ3M9dGhpcy5hWzddO3RoaXMud3I9dGhpcy5hWzNdO3RoaXMudGg9dGhpcy5hWzRdO3RoaXMuUHM9dGhpcy5hWzFdO3RoaXMuaT10aGlzLmFbMTBdfWMueGk9YjtiLnByb3RvdHlwZT17ZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmdzOnRoaXMudnIoYSl9LHZyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLndyOnRoaXMuc2goYSl9LHNoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy50aDp0aGlzLk9zKGEpfSxPczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHM6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBqYT1jLnhpfHxqYSxKYz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1KYy5mcyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe31jLm9qPWI7Yi5wcm90b3R5cGU9e1ZkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmLGM7aWYoMD09YS5sZW5ndGgpcmV0dXJuIGI7ZD0wO2ZvcihjPWEubGVuZ3RoO2Q8YztkKyspZj1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitmLGJ8PTA7cmV0dXJuIE1hdGguYWJzKGIpfSxmYjpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvCjFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4Iil9LEJxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpKyhuZXcgRGF0ZSkudG9UaW1lU3RyaW5nKCkuc3Vic3RyKC0xMil9LFNjOmZ1bmN0aW9uKGEpe2E9cGFyc2VJbnQoYSk7aWYoNjU8PWEmJjkwPj1hfHw5Nzw9YSYmMTIyPj1hKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpO2lmKDA+PWEpcmV0dXJuIiI7aWYoNjU+YSlyZXR1cm4gdGhpcy5TYyhhKwo2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5TYyhNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGZjOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuVmQodGhpcy5mYigpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLlNjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifSxKcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZjKCkrIjIifSxaZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlZkKHRoaXMuQnEoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5TYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9CmMub2p8fFI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRHM9dGhpcy5hWzEwXTt0aGlzLktrPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNl07dGhpcy5WcD10aGlzLmFbOV07dGhpcy5ydj10aGlzLmFbOF07dGhpcy5Ccz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs1XX1jLk1yPWI7Yi5wcm90b3R5cGU9e0NzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Eczp0aGlzLkprKGEpfSxKazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuS2s6dGhpcy52byhhKX0sdm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndvOnRoaXMuVXAoYSl9LFVwOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5WcDp0aGlzLnF2KGEpfSxxdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnY6dGhpcy5BcyhhKX0sQXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkJzOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmk6YX19fSkoYyk7dmFyIGthPWMuTXJ8fGthLEtjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLkNzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmo7dGhpcy5qPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5qPWc7cmV0dXJuIGZ9fShjLApnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmM/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy5UZT1ifSkoYyk7dmFyIEs9Yy5UZXx8SztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5mbj10aGlzLmFbNV07dGhpcy5Waj10aGlzLmFbNl07dGhpcy5NbT10aGlzLmFbNV07dGhpcy5rbz10aGlzLmFbMl07dGhpcy5ZdD10aGlzLmFbNV07dGhpcy5tbz10aGlzLmFbOF07dGhpcy5laj10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs2XX1jLnp3PWI7Yi5wcm90b3R5cGU9e2VuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5mbjp0aGlzLlVqKGEpfSxVajpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlZqOnRoaXMuTG0oYSl9LExtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5NbTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua286dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLll0OnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZWo6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYT1jLnp3fHxsYSxMYz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1MYy5lbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLm5sPUsuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueWE9e307dGhpcy5BPW51bGw7dGhpcy5qYz0KMTAwO3RoaXMub2I9MDt0aGlzLnhhPTE1MDt0aGlzLnRiPTA7dGhpcy5GdShiKX0sYjpmdW5jdGlvbigpe30sSTpmdW5jdGlvbigpe3RoaXMub2I8PXRoaXMueGE/KHRoaXMub2IrKyx0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKTowPnRoaXMueGEmJih0aGlzLnRiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuamMpKX0sdnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vYj50aGlzLnhhPyEwOiExfSxGZzpmdW5jdGlvbigpe3RoaXMub2I9MH0sTDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZ1OmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxBcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEo6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmZiKCldPWI7TCYmTC5oZyYmTC5adShiKX0sQXg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5GYSh0aGlzLnlhKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy55YSlpZihhPT0KdGhpcy55YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy55YVtiLmZiKCldPyEwOiExfSxTcjpmdW5jdGlvbihiKXtiPWIuRWEoKTtmb3IodmFyIGEgaW4gdGhpcy55YSlpZihiLmlkPT10aGlzLnlhW2FdLkVhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LE94OmZ1bmN0aW9uKGIpe3RoaXMueWFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMubmx8fHI7KGZ1bmN0aW9uKGMpe2MucGw9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5qYz0xMDt0aGlzLm9iPTA7dGhpcy54YT01MDt0aGlzLks9bnVsbDt0aGlzLmthPSExO3RoaXMucGxheWVyPWI7dGhpcy5oYj0iIjt0aGlzLnlmPSExO3RoaXMuTigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuRWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz0KYSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGZhOmZ1bmN0aW9uKCl7fSxPdTpmdW5jdGlvbihiKXt0aGlzLks9Yn0sQng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LfSxJdTpmdW5jdGlvbihiKXt0aGlzLmxlPWJ9LHp4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGV9LGtlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy5vYjw9dGhpcy54YSYmKHRoaXMub2IrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmpjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxLZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxQeDpmdW5jdGlvbigpe30sVTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5YcSgpfHx0aGlzLnVuKCk7dGhpcy5EZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHVuOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLnBhKDEwKSl9LFhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxTOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LEVhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LCRjOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbGI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sSXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5rYX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmthPSEwfSxHYjpmdW5jdGlvbigpe3ZhciBiPWw7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sS2c6ZnVuY3Rpb24oYil7dGhpcy5oYj1ifSx5eDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhifSxFZzpmdW5jdGlvbigpe3RoaXMuaGI9bnVsbH0sRXg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmhiJiYoYj0hMCk7cmV0dXJuIGJ9LEt4OmZ1bmN0aW9uKCl7dGhpcy55Znx8KHRoaXMueWY9ITApfSxUYzpmdW5jdGlvbigpe3JldHVybiExfSwKdng6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMucGx8fHA7KGZ1bmN0aW9uKGMpe2MucGg9Sy5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLkE9dGhpcy5wbGF5ZXI9IiI7dGhpcy5iZj0iMSI7dGhpcy5jZj0iMiI7dGhpcy4kbT0iMyI7dGhpcy5zYz0wO3RoaXMubmc9MzA7dGhpcy54Yj1bXTt0aGlzLlJhPVtdO3RoaXMuT2I9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuamY9dGhpcy5kaD0hMTt0aGlzLnN0YXR1cz10aGlzLnNjO3RoaXMuaWQ9ZS5wYSgxMCk7dGhpcy5qZChiKTt0aGlzLkd1KGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuZGh8fCh0aGlzLmRoPSEwLGUuaGUoKSl9LG9lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuTCgpO1MmJlMuRGImJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaWEoKT8hMToodGhpcy5MdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLGcpLHRoaXMuV2coKSx0aGlzLmpmPSEwLGEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhKCksITApfSxsOmZ1bmN0aW9uKGIsYSl7dGhpcy5pYSgpfHwodGhpcy54Yi5wdXNoKGIpLHRoaXMuUmEucHVzaCh7cmVhc29uOmIsZGV0YWlsOmF9KSl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9InVua25vd24iLGE9W107dGhpcy54YiYmMDx0aGlzLnhiLmxlbmd0aCYmKHRoaXMueGI9ZS51bmlxdWUodGhpcy54YiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMueGIuam9pbigiLCIpKSk7aWYodGhpcy5SYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlJhLmxlbmd0aDtnKyspdGhpcy5PYlt0aGlzLlJhW2ddLnJlYXNvbl09PQp0aGlzLk9iW2JdJiZhLnB1c2godGhpcy5SYVtnXS5kZXRhaWwpLHRoaXMuT2JbdGhpcy5SYVtnXS5yZWFzb25dPHRoaXMuT2JbYl0mJihhPVtdLGEucHVzaCh0aGlzLlJhW2ddLmRldGFpbCksYj10aGlzLlJhW2ddLnJlYXNvbik7dGhpcy5PYltiXXx8KGI9InVua25vd24iLGE9W10pOzA8YS5sZW5ndGgmJihnPWUudW5pcXVlKGEpLGI9YisiLSIrZy5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYiwhMCxhKX19LER4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuamZ9LG86ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmJmfSxMdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuY2Z9LE11OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy4kbX0scGI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLnNjfSxkZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5iZn0sang6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuY2Z9LAppYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5zY30samQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxHdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0sQXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSx2czpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMucGh8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Y9dGhpcy5hWzZdO3RoaXMuSnQ9dGhpcy5hWzldO3RoaXMuTWs9dGhpcy5hWzNdO3RoaXMubGw9dGhpcy5hWzJdO3RoaXMuemo9dGhpcy5hWzEwXTt0aGlzLml0PXRoaXMuYVs1XTt0aGlzLlZsPXRoaXMuYVs5XTt0aGlzLm9wPXRoaXMuYVs0XTt0aGlzLlRsPXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzEwXX1jLnd0PWI7Yi5wcm90b3R5cGU9e1Z2OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuV3Y6dGhpcy5JdChhKX0sSXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkp0OnRoaXMuTGsoYSl9LExrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Nazp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubGw6dGhpcy55aihhKX0seWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnpqOnRoaXMuaHQoYSl9LGh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5pdDp0aGlzLlVsKGEpfSxVbDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVmw6dGhpcy5ucChhKX0sbnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9wOnRoaXMuU2woYSl9LFNsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5UbDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7dmFyIG5hPWMud3R8fG5hLE1jPW5ldyBuYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Wdig0KTsoZnVuY3Rpb24oYyl7Yy5waT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLksmJnRoaXMuSygpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkRlbW9WaWRlb0pTIn19KX0pKGMpOwp2YXIgVD1jLnBpfHxUOyhmdW5jdGlvbihjKXtjLm9pPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSk7dGhpcy52ZD1udWxsO3RoaXMuZHc9MUUzO3RoaXMueGc9bnVsbDt0aGlzLnh2PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy5zbyliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLmdxLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5UcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLlNxKGEsYil9LmJpbmQodGhpcykpO2IudnBFdmVudCYmKGIub24oInBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5ndyhiKX0uYmluZCh0aGlzKSksYi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IixmdW5jdGlvbigpe3RoaXMuaHcoYil9LmJpbmQodGhpcykpKTsKYi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuUnEoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLmZwKGEpfS5iaW5kKHRoaXMpKX0sZnA6ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxndzpmdW5jdGlvbihiKXt0aGlzLnZkfHwodGhpcy52ZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaXcoYil9LmJpbmQodGhpcyksdGhpcy5kdykpfSxpdzpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy52ZCk7dGhpcy53KCl9LGh3OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnZkKX0sUnE6ZnVuY3Rpb24oYil7dGhpcy5xeChiKTt0aGlzLnhnPW5ldyBEYXRlO3RoaXMueGctdGhpcy5idTx0aGlzLnh2P3RoaXMudygpOnRoaXMubygpfSxUcTpmdW5jdGlvbihiLGEpeyFhJiZiLnRhcmdldC5wbGF5ZXImJihhPWIudGFyZ2V0LnBsYXllcix0aGlzLmpkKG5ldyBUKGEpKSk7CnRoaXMudygpfSxncTpmdW5jdGlvbigpe30sU3E6ZnVuY3Rpb24oKXt0aGlzLmJ1PW5ldyBEYXRlfX0pfSkoYyk7dmFyIG9hPWMub2l8fG9hOyhmdW5jdGlvbihjKXtjLnJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGUuRmEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgVChiW2FdKTt0aGlzLkgoZyl8fCh0aGlzLkooZyksKG5ldyBvYShnLHRoaXMuQSkpLmIoKSl9fXRoaXMuSSgpfX19KX0pKGMpO3ZhciBwYT1jLnJpfHxwYSxxYT1uZXcgcGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudnA9dGhpcy5hWzhdO3RoaXMuaT0KdGhpcy5hWzFdfWMuZmw9YjtiLnByb3RvdHlwZT17dXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnZwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcmE9Yy5mbHx8cmEsTmM9bmV3IHJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudXAoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt0aGlzLkRmKCk7dGhpcy5GZigpO3RoaXMuZ3A9ITF9LERmOmZ1bmN0aW9uKCl7dGhpcy5FYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuRWI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlOwp0aGlzLlMoYil9LEZmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRWIpe3ZhciBiPXRoaXMuRWEoKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkViPSEwKTt0aGlzLlUoYSl9fSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmCigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pLGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe2EuZHVyYXRpb24mJmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKSl9LGtlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMubWQoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm1kKGEpfS5iaW5kKHRoaXMpKX0sbWQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmCmEuZ2V0UG9zaXRpb24mJjMwPGEuZ2V0UG9zaXRpb24oKSYmMzA8YS5nZXREdXJhdGlvbigpLWEuZ2V0UG9zaXRpb24oKSYmdGhpcy5sZSYmKDAsdGhpcy5sZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LAp2YTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxUYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHNhPWMuT2p8fHNhOyhmdW5jdGlvbihjKXtjLk5qPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE46ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5zYzt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITF9LGI6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnVjPSExO3RoaXMuQ2Q9MTt0aGlzLndjPVtdO3RoaXMuYmI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJgooYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLkNkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuYmI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmJiPSEwKSk6dGhpcy5vKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLApjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRDb21wbGV0ZSIpO3RoaXMudWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkSW1wcmVzc2lvbiIpO3RoaXMub2UoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiYKYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm8oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLm5nJiYhdGhpcy5pYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwKIiIpLHRoaXMucygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5zKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmlhKCkmJih0aGlzLnBiKCksdGhpcy5nZXRQbGF5ZXIoKS5ncD0hMCxsLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuaGI7YSYmKGEucWUoKSxhLkxkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkQ29tcGxldGUiKTt0aGlzLnVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRJbXByZXNzaW9uIik7CnRoaXMub2UoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5vKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm8oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMubmcmJiF0aGlzLmlhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnMoKSk6KHRoaXMubCgiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMucyghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy53Yy5pbmRleE9mKGEpJiYKdGhpcy53Yy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm8oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5vKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubygiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMud2MubGVuZ3RoPj10aGlzLkNkJiZ0aGlzLnMoKSl9LHZzOmZ1bmN0aW9uKGIpe3RoaXMuaigiSlc6ICIrYi50eXBlKX0sczpmdW5jdGlvbihiKXtiP3RoaXMuUGQ/dGhpcy5QZCsrOnRoaXMuUGQ9MTp0aGlzLk9kP3RoaXMuT2QrKzp0aGlzLk9kPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLll1KGEudmlkZW9UYWcpP2EuRWI/dGhpcy5vKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy51Y3x8dGhpcy5pc1BsYXlpbmc/Cih0aGlzLk9kPnRoaXMuUGQmJihiPSExKSx0aGlzLncoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5EZigpLGEuRmYoKSxhLkVifHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucyhiKX0uYmluZCh0aGlzKSwyMCkpfX0pfSkoYyk7dmFyIHRhPWMuTmp8fHRhOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWUuSmEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMud3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImp3cGxheWVyIik7aWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZyYmZygpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGc9MDtnPGEubGVuZ3RoO2crKyliLnB1c2goYVtnXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0pLGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5TcihnKXx8KHRoaXMuSihnKSxnPW5ldyB0YShnLHRoaXMuQSksCmcuTigpLGcuYigpKX1lbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0seHg6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sd3E6ZnVuY3Rpb24oKXt2YXIgYj1lLkphKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO3JldHVybiBlLnpiKGIuYW5jaG9yKX19KX0pKGMpO3ZhciB1YT1jLlBqfHx1YSx2YT1uZXcgdWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR3A9dGhpcy5hWzEwXTt0aGlzLmk9dGhpcy5hWzhdfWMuVmk9YjtiLnByb3RvdHlwZT17RnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdwOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaTphfX19KShjKTt2YXIgd2E9Yy5WaXx8d2EsT2M9bmV3IHdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLkZwKDQpOyhmdW5jdGlvbihjKXtjLkRtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5VKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB4YT1jLkRtfHx4YTsoZnVuY3Rpb24oYyl7Yy5DbT11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm8oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5zKCkpfSxzOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB5YT1jLkNtfHx5YTsoZnVuY3Rpb24oYyl7Yy5FbT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJgp3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5GYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgeGEoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeWEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgemE9Yy5FbXx8emEsQWE9bmV3IHphKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh2PXRoaXMuYVs1XTt0aGlzLktwPXRoaXMuYVs3XTt0aGlzLkN3PXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVsyXTt0aGlzLlpzPXRoaXMuYVs5XTsKdGhpcy5QcD10aGlzLmFbNl07dGhpcy5jdD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbMTBdO3RoaXMuUHY9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbM119Yy5HaT1iO2IucHJvdG90eXBlPXtHdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHY6dGhpcy5KcChhKX0sSnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLktwOnRoaXMuQncoYSl9LEJ3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddzp0aGlzLm1tKGEpfSxtbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubm06dGhpcy5ZcyhhKX0sWXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlpzOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5QcDp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuY3Q6dGhpcy55aShhKX0seWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnppOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuUHY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBCYT1jLkdpfHxCYSxQYz1uZXcgQmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5Hdig0KTsoZnVuY3Rpb24oYyl7Yy52bT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5TKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlUoYik6dGhpcy5lYSgpKTp0aGlzLmVhKCl9ZWxzZSB0aGlzLmVhKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKGIpe3RoaXMuc2IoYil9LmJpbmQodGhpcykpfSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5LJiZ0aGlzLksoKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LAppc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgQ2E9Yy52bXx8Q2E7KGZ1bmN0aW9uKGMpe2MudW09dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuVj10aGlzLlZ8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT10aGlzLmVjPXRoaXMuWGE9dGhpcy5CYz0hMTt0aGlzLkNnPWUubmIoMTApO3RoaXMuYmg9ITA7dGhpcy5HZD10aGlzLldmPSExO3RoaXMuc2coKTt0aGlzLklvKCk7dGhpcy5LYSgpfSxMeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmNvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlcsIjsiLHR5cGVvZiBiLlcsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuVz9iLlcuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLlc/dHlwZW9mIGIuVy5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkYsIjsiLHR5cGVvZiBiLkYsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5zYT9iLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLnNhP3R5cGVvZiBiLmltYS5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsCiI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi56ZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnpkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuQWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5BZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLkFkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLAoiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5GZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYuRmQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5GZDoidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkNnKX0sZ2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJgoodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxVYzpmdW5jdGlvbigpe2lmKCF0aGlzLm1hKXt2YXIgYj10aGlzLmdiKCk7YiYmKGIuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmFkc0xvYWRlciksYi5fYWRzTG9hZGVyJiYodGhpcy5tYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5tYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5tYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5tYX0sTmY6ZnVuY3Rpb24oKXtpZighdGhpcy5lYyl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLmVjPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5lYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLmVjfSwKUXI6ZnVuY3Rpb24oKXtpZighdGhpcy5WZil7dmFyIGI9dGhpcy5nYigpLGE9dGhpcy5PcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmKHRoaXMuVmY9ITApfXJldHVybiB0aGlzLlZmfSxPcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuQmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLkJjPSEwKTtyZXR1cm4gdGhpcy5CY30sS2E6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlVjKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGc9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihnPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCl9LmJpbmQodGhpcykpLApiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuQWUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sQWU6ZnVuY3Rpb24oKXt0aGlzLkdkPSEwO3ZhciBiPXRoaXMuTmYoKTtpZihifHx0aGlzLmlhKCkpe3ZhciBhPSJhZEVycm9yIixnPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLllhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuU2I9ITA7aWYoZS5qYigiY2hpcC5kZSIpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2UudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuU2I9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLlNiPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5TYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuWSgpLHRoaXMucygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCl9LHd4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5zZiYmYi5hZHMmJih0aGlzLnNmPWIuYWRzKTtyZXR1cm4gdGhpcy5zZn0sSW86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlgoYSk7dGhpcy5ZKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlYpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMuWSgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubygpO3RoaXMub2UoKX0uYmluZCh0aGlzKSl9LHZmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5OZigpO2ImJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudmYoKX0uYmluZCh0aGlzKSw1MCl9LHNnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPApiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5RcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLlVjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLlVjKCksdGhpcy5HZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdkP3RoaXMubygpOih0aGlzLlkoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLmdiKCl9ZWxzZSB0aGlzLldmP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nYigpLGI9dGhpcy5VYygpO2EmJiFiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuWSgpKToodGhpcy5ZKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5XZj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCl9LmJpbmQodGhpcyksCjUwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxKbzpmdW5jdGlvbigpe3RoaXMuV2J8fCh0aGlzLldiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5XYiE9Yi5hZHMuc3RhdGUmJih0aGlzLldiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLldiKXt0aGlzLm8oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuV2I9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkpvKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITA7dGhpcy5vKCJlbXB0eSB2YXN0Iil9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMuaWEoKXx8KGJ8fCh0aGlzLmJoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLmJoLGZ1bmN0aW9uKCl7dGhpcy52ZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxPbzpmdW5jdGlvbigpe3RoaXMuR3h8fCgxMDx0aGlzLmV3Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApKToodGhpcy5ldysrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk9vKCl9LmJpbmQodGhpcyksNTApKSl9LHV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5mdyl7dGhpcy5mdz0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlkuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgRGE9Yy51bXx8RGE7KGZ1bmN0aW9uKGMpe2Mud209ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuUGcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLlBnKGJbZ10pfWNhdGNoKGQpe310aGlzLkkoKX19LFBnOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLkZhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IENhKGJbZ10pLGEua2F8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgRGEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMudGI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5qYyl9fSl9KShjKTt2YXIgRWE9Yy53bXx8RWEsRmE9bmV3IEVhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkl3PXRoaXMuYVs5XTt0aGlzLkN2PXRoaXMuYVs5XTt0aGlzLlhzPXRoaXMuYVs2XTt0aGlzLkh0PXRoaXMuYVs0XTt0aGlzLiR0PXRoaXMuYVs2XTt0aGlzLnhoPXRoaXMuYVs3XTt0aGlzLlh3PXRoaXMuYVs3XTt0aGlzLnNtPXRoaXMuYVszXTt0aGlzLlFtPQp0aGlzLmFbN107dGhpcy5xbT10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVs0XX1jLmpwPWI7Yi5wcm90b3R5cGU9e0h3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Jdzp0aGlzLkJ2KGEpfSxCdjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQ3Y6dGhpcy5XcyhhKX0sV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlhzOnRoaXMuR3QoYSl9LEd0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5IdDp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuJHQ6dGhpcy53aChhKX0sd2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnhoOnRoaXMuV3coYSl9LFd3OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ydzp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNtOnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5RbTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnFtOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgR2E9Yy5qcHx8R2EsUWM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSHcoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5TKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlUoYSl9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmdldEN1cnJlbnRUaW1lKCksCmc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LHZhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7YS5pc011dGVkJiZhLmlzTXV0ZWQoKSYmKGI9ITApOwpyZXR1cm4gYn0sVGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEhhPWMuUWx8fEhhOyhmdW5jdGlvbihjKXtjLlBsPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkNiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLm9jPSExO3RoaXMuRGcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubygpO2Vsc2V7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpdGhpcy5vYz0KITAsdGhpcy5vKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy5HYygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLnBmKCk6dGhpcy5vKCl9LEdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmlhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5vKCk7ZWxzZXtpZigxMDA5PT1nfHwzMDM9PWd8fDQwMz09Zyl0aGlzLm9jPSEwLHRoaXMubygpOwp0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMub2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HYyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm8oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5HYy5iaW5kKHRoaXMpLDEwMCl9fSxwZjpmdW5jdGlvbigpe2lmKCF0aGlzLmlhKCkpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ImFkTG9hZGluZ0VtcHR5Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSwKdGhpcy5vKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkNiKSx0aGlzLm8oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQ2IpLHRoaXMubygpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQ2ImJih0aGlzLkNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vY3x8KHRoaXMubCgiYWRlcnJvciIsImFkTG9hZGluZ0Vycm9yIiksdGhpcy53KCkpfS5iaW5kKHRoaXMpLDIwMCkpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGYuYmluZCh0aGlzKSw1MCl9fSxEZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZ2V0UGxheWVyKCk7CmIuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5vYz0hMCx0aGlzLm8oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJnRoaXMubygpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGcoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgSWE9Yy5QbHx8SWE7KGZ1bmN0aW9uKGMpe2MuUmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnZpZGVvJiYKdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBIYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSWEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIEphPWMuUmx8fEphLEthPW5ldyBKYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbMTBdO3RoaXMubHM9dGhpcy5hWzldO3RoaXMuRXA9dGhpcy5hWzldO3RoaXMuT2s9dGhpcy5hWzhdO3RoaXMuQmk9dGhpcy5hWzddO3RoaXMuZG49dGhpcy5hWzddO3RoaXMuTHc9dGhpcy5hWzEwXTt0aGlzLm5oPXRoaXMuYVsyXTt0aGlzLnFwPXRoaXMuYVs2XTt0aGlzLlZuPXRoaXMuYVszXTt0aGlzLmk9dGhpcy5hWzEwXX1jLkRsPWI7Yi5wcm90b3R5cGU9e1p3OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuJHc6dGhpcy5rcyhhKX0sa3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmxzOnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5FcDp0aGlzLk5rKGEpfSxOazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT2s6dGhpcy5BaShhKX0sQWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkJpOnRoaXMuY24oYSl9LGNuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5kbjp0aGlzLkt3KGEpfSxLdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHc6dGhpcy5taChhKX0sbWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5oOnRoaXMucHAoYSl9LHBwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5xcDp0aGlzLlVuKGEpfSxVbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZuOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgTGE9Yy5EbHx8TGEsUmM9bmV3IExhKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVJjLlp3KDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIpO3RoaXMucmc9YX0sTjpmdW5jdGlvbigpe30saWU6ZnVuY3Rpb24oYil7dGhpcy5yZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5yZykucGFyZW50Tm9kZTt0aGlzLlMoYik7dGhpcy5VKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTWE9Yy5RaHx8TWE7KGZ1bmN0aW9uKGMpe2MuUGg9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT0KZzt0aGlzLmooYixhKX0saWU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciBOYT1jLlBofHxOYTsoZnVuY3Rpb24oYyl7Yy5SaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSxkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBNYShkLGEpLHRoaXMuSChkKXx8KGQuaWUoYSksdGhpcy5KKGQpLGQ9bmV3IE5hKGQsdGhpcy5BLGcpLGQuaWUoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2E9Yy5SaHx8T2EsUGE9bmV3IE9hKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueGo9dGhpcy5hWzldO3RoaXMuVms9dGhpcy5hWzEwXTt0aGlzLkhvPXRoaXMuYVs5XTt0aGlzLklqPXRoaXMuYVszXTt0aGlzLmppPXRoaXMuYVs4XTt0aGlzLkZ2PXRoaXMuYVs0XTt0aGlzLkFrPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVsxMF07dGhpcy5zdD10aGlzLmFbN107dGhpcy5pPXRoaXMuYVs5XX1jLnl1PWI7Yi5wcm90b3R5cGU9e3dqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlVrKGEpfSxVazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlZrOnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ibzp0aGlzLkhqKGEpfSxIajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSWo6dGhpcy5paShhKX0saWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmppOnRoaXMuRXYoYSl9LEV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdjoKdGhpcy56ayhhKX0sems6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFrOnRoaXMud3MoYSl9LHdzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54czp0aGlzLnJ0KGEpfSxydDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc3Q6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBRYT1jLnl1fHxRYSxTYz1uZXcgUWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53aig0KTsoZnVuY3Rpb24oYyl7Yy50az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5TKGIpO3RoaXMuVShiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksCmE9MDthPGIubGVuZ3RoO2ErKyliW2FdLmRhdGE9IiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBSYT1jLnRrfHxSYTsoZnVuY3Rpb24oYyl7Yy5zaz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLnZjKCl9LmJpbmQodGhpcykpLAokKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oImNsaWNrIixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMudmMoKX0uYmluZCh0aGlzKSkpOnRoaXMudmMoKX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5vKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFNhPWMuc2t8fFNhOyhmdW5jdGlvbihjKXtjLnVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj0KbmV3IFJhKE5JQ0suR2FtZUxvYWRlcik7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgU2EoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFRhPWMudWt8fFRhLFVhPW5ldyBUYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sdz10aGlzLmFbNV07dGhpcy4kcT10aGlzLmFbMl07dGhpcy5VbT10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzRdO3RoaXMuRm89dGhpcy5hWzRdO3RoaXMuWGs9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbOF19Yy5BbT1iO2IucHJvdG90eXBlPXtRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5acShhKX0sWnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRxOnRoaXMuVG0oYSl9LFRtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5VbTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLkJqOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBWYT1jLkFtfHxWYSxUYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5Rdyg0KTsoZnVuY3Rpb24oYyl7Yy5jbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt0aGlzLnJlPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYKKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuZWEoKTtyZXR1cm59dGhpcy5TKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlUoYik6dGhpcy5lYSgpfSxjdTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmhiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5EYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5xZSgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMucmU9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLAoiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sbGI6ZnVuY3Rpb24oKXt0aGlzLnJlKys7aWYoMTA8dGhpcy5yZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmlmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWUpcmV0dXJuIGIucGxheWVySW5zdGFuY2UuY3VycmVudFRpbWU7aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGZhOmZ1bmN0aW9uKCl7fSxzYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpOwp2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5LJiZ0aGlzLksoKX19KX0pKGMpO3ZhciBXYT1jLmNsfHxXYTsoZnVuY3Rpb24oYyl7Yy5ibD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxYYTpmdW5jdGlvbigpe2lmKCF0aGlzLlJkKWlmKHRoaXMuaWJ8fCh0aGlzLmliPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaWIrKywxNTx0aGlzLmliKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuUmQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYKKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVj1hLGIubCgiYWRlcnJvciIsCmEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlY9dGhpcy5WfHwhMTt0aGlzLlhhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJgohdGhpcy5lcT8od2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCh3aW5kb3cub3ZWaWRlby5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksdGhpcy5lcT0hMCx3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2IuY3UoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LHM6ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFhhPWMuYmx8fFhhOyhmdW5jdGlvbihjKXtjLmRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmCjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoO2IrKyl7dmFyIGE9bmV3IFdhKHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyW2JdKTthLmthfHx0aGlzLkgoYSl8fCh0aGlzLkooYSksKG5ldyBYYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgWWE9Yy5kbHx8WWEsWmE9bmV3IFlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVzPXRoaXMuYVsyXTt0aGlzLkltPXRoaXMuYVsxMF07dGhpcy5Hdz10aGlzLmFbNV07dGhpcy5pPXRoaXMuYVs3XX1jLlpyPWI7Yi5wcm90b3R5cGU9e2RzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5lczp0aGlzLkhtKGEpfSwKSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkZ3KGEpfSxGdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkd3OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmk6YX19fSkoYyk7dmFyICRhPWMuWnJ8fCRhLFVjPW5ldyAkYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLmRzKDQpOyhmdW5jdGlvbihjKXtjLmpqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5TKGIuZWxlbWVudCk7dGhpcy5VKGIuZWxlbWVudCl9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sCnZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSGl0Ym94In19KX0pKGMpO3ZhciBhYj1jLmpqfHxhYjsoZnVuY3Rpb24oYyl7Yy5paj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgYmI9Yy5panx8YmI7KGZ1bmN0aW9uKGMpe2Mua2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLApmdW5jdGlvbihiKXtiPW5ldyBhYihiLmRldGFpbCk7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgYmIoYix0aGlzLkEpKS5iKCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBjYj1jLmtqfHxjYixkYj1uZXcgY2IocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuanU9dGhpcy5hWzFdO3RoaXMuUnA9dGhpcy5hWzFdO3RoaXMuVGo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzEwXTt0aGlzLmt0PXRoaXMuYVsyXTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLnZsPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9e2l1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qdTp0aGlzLlFwKGEpfSxRcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUnA6dGhpcy5TaihhKX0sU2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlRqOgp0aGlzLktyKGEpfSxLcjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHI6dGhpcy5qdChhKX0sanQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmt0OnRoaXMuc3AoYSl9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy50cDp0aGlzLnVsKGEpfSx1bDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmw6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBlYj1jLkRyfHxlYixWYz1uZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1WYy5pdSg0KTsoZnVuY3Rpb24oYyl7Yy5Eaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5MZihiLCJlbGVtZW50SUQiKTt0aGlzLnpnPWIucG9zaXRpb25pbmc7CnZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuemc/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlMoZyk7dGhpcy5VKGcpO3RoaXMuUGM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlBjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5QYyl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LApObzpmdW5jdGlvbigpe2UuYWcodGhpcy5QYyk7ZS5iZyh0aGlzLlBjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTm8oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sZWU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBmYj1jLkRqfHxmYjsoZnVuY3Rpb24oYyl7Yy5Daj11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5sKCJleHRlcm5hbCIpO3RoaXMudyghMCl9fSl9KShjKTt2YXIgZ2I9Yy5Danx8Z2I7KGZ1bmN0aW9uKGMpe2MuRWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy54YT0xNTAwO3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwuaW5yZWFkKXt2YXIgYj1sLmlucmVhZCxhPWUuTGYoYiwiZWxlbWVudElEIik7ZS5hZyhhKSYmKGI9bmV3IGZiKGIpLHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGdiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy50Yj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMudGI9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGhiPWMuRWp8fGhiLGliPW5ldyBoYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs3XX1jLll3PWI7Yi5wcm90b3R5cGU9e0puOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Lbjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmk6YX19fSkoYyk7dmFyIGpiPWMuWXd8fGpiLFdjPW5ldyBqYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLkpuKDQpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMudXJsPWE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMucGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sSHU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx2bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLnBqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuUGE9YTt0aGlzLkhmPXRoaXMubGg9ITE7dGhpcy50Zz1kO3RoaXMuUWc9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuUGE9bmV3IHooYSkpO3ZhciBlPXRoaXMudmI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8CjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXN8fGcoZSk7aWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLmJlKHRoaXMuUGEudXJsKSYmbS5yZCl7dmFyIGg9bmV3IHooYS51cmwpO2guSHUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLnFqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlBhLmRhdGE7CmlmKCJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGI9YSxhPSIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5IZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuUWc/dGhpcy52Yi5vcGVuKHRoaXMuUGEubWV0aG9kLHRoaXMuUGEudXJsLCExKTp0aGlzLnZiLm9wZW4odGhpcy5QYS5tZXRob2QsdGhpcy5QYS51cmwsITApLHRoaXMubGh8fCh0aGlzLnZiLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy52Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSx0aGlzLnZiLnNlbmQoYSl9Y2F0Y2goYyl7bSYmbS5iZSh0aGlzLlBhLnVybCk/bS5yZD9tLmhhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLmJlKHRoaXMuUGEudXJsKSwKdGhpcy50ZyYmdGhpcy50ZygpfXJldHVybiB0aGlzLnZifX19KShjKTt2YXIga2I9Yy5xanx8a2I7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLm9hPSExO3RoaXMuVWI9IiI7dGhpcy5IZD10aGlzLlRiPXRoaXMuZWI9bnVsbDt0aGlzLnhwPXRoaXMucWI9dGhpcy5pZz0hMTt0aGlzLnVhPSIiO3RoaXMuZGc9ITE7dGhpcy5CYT10aGlzLlhjPSIiO3RoaXMuJGY9dGhpcy5hYT10aGlzLmlzRW5hYmxlZD10aGlzLnhlPSExO3RoaXMuT2E9W107dGhpcy5UZj10aGlzLkliPSIiO3RoaXMuTmQ9ITE7dGhpcy5LZT0wO3RoaXMuWGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7dGhpcy5WZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMud2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMucmM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuV2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjsKdGhpcy5LYj0iIjt0aGlzLnJiPVtdO3RoaXMuTGI9W107dGhpcy5KYj0iIjt0aGlzLkxlPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuWGQ9ITE7dGhpcy5Qbz10aGlzLnNkPW51bGw7dGhpcy5OZz10aGlzLnBjPXRoaXMuQWY9dGhpcy5OZT10aGlzLnJkPXRoaXMuSWQ9dGhpcy50Yz0hMTt0aGlzLlNhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLnJqPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuVWIsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5UYixhZHRhZ3JlZ2V4OnRoaXMuSGQsanNwb3B1cHM6dGhpcy5pZyxzaWRlbG9hZHM6dGhpcy5xYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMudWEsaXNJbml0aWFsaXplZDp0aGlzLmRnLGdsb2JhbENvbmZpZzp0aGlzLlhjLGNsaWVudENvbmZpZzp0aGlzLkJhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCwKaXNWZXJpZmllZDp0aGlzLmFhLGlzQmxvY2tlZDp0aGlzLiRmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkliLGhvbWFkQWRwYXRoOnRoaXMuVGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5OZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5LZSxIT01BRF9WRVJJRklFRDp0aGlzLlhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5WZSxIT01BRF9OT0JMT0NLRVI6dGhpcy53YixIT01BRF9BREJMT0NLRVI6dGhpcy5yYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuV2UsdGVzdEhpZGU6dGhpcy5LYix0ZXN0VGFnczp0aGlzLnJiLHRlc3RUYWdzSlM6dGhpcy5MYix0ZXN0Q29va2llOnRoaXMuSmIsdGhyb3R0bGU6dGhpcy5MZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLlhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuUG8sYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy50YyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuSWQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMucmQsCnVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLk5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuU2Esc2l0ZUNvbmZpZzp0aGlzLkhiLHNlcnZlcklkOnRoaXMuSWcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlliLHZwYWlkOnRoaXMucGMsc2tpcEFsbG93ZWQ6dGhpcy5OZ319LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlNhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuU2FbYl0mJjE9PXRoaXMuU2FbYl0mJihhPSEwKTtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dGhpcy5TYVthXT0hMH0seHE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuU2EpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5TYVtiXSYmMT09dGhpcy5TYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxwZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5wbyhhKX0sR2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixsPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLmFlKGEpO2U9dGhpcy5KYShhKTtjPyh0aGlzLmdjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsbD1lLnBhdGguc3Vic3RyKDEpKTooaD10aGlzLnplKCksbD1lLnBhdGguc3Vic3RyKDEpKyhlLnF1ZXJ5PyI/IitlLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuVWJ8fHRoaXMuZWJ8fAp0aGlzLlRifHx0aGlzLkhkKSYmKGw9dGhpcy5OcyhsKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLnpxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1sO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGwpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sYWU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmdjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTsKcmV0dXJuIGJ9LGdjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxiZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLmFlKGEpO3JldHVybiBifSx6cTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudWEmJjA8dGhpcy51YS5sZW5ndGgpcmV0dXJuIHRoaXMudWE7Zm9yKGQgaW4gdGhpcy51YSlpZihiPXRoaXMudWFbZF0sYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09CmEpcmV0dXJuIGIub3g7cmV0dXJuIm5vbmUifSxaYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMuSWddfSx6ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWmMoKSxiPXRoaXMuTWcoKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb2c6ZnVuY3Rpb24oYSxiLGQpe2E9ITE7Yj0iIjtpZihkLmV2YWwpdHJ5e2I9ZXZhbCgiKCIrZC5ldmFsKyIpKCkiKX1jYXRjaChjKXthPSEwfWVsc2UgYT0hMDthJiYiS0VFUCIhPT1kLmZhbGxiYWNrJiYoYj1kLmZhbGxiYWNrKTtyZXR1cm4gYn0sTXM6ZnVuY3Rpb24oYSxiKXt2YXIgZD1lLkphKGEpLGM9IiIsYz0iIixoO2ZvcihoIGluIGIpe2lmKGJbaF0uc3VidmFsdWVzKXtmb3IodmFyIEQ9ZGVjb2RlVVJJQ29tcG9uZW50KGQucXVlcnlLZXlbaF0pLnNwbGl0KCImIiksCmM9e30sbD0wO2w8RC5sZW5ndGg7bCsrKXt2YXIgdD1EW2xdLnNwbGl0KCI9Iik7Y1t0WzBdXT10WzFdfWZvcih2YXIgayBpbiBiW2hdLnN1YnZhbHVlcyljW2tdPXRoaXMub2coY1trXSxrLGJbaF0uc3VidmFsdWVzW2tdKTtEPVtdO2ZvcihrIGluIGMpRC5wdXNoKGsrIj0iK2Nba10pO2M9RD1lbmNvZGVVUklDb21wb25lbnQoRC5qb2luKCImIikpfWVsc2UgYz10aGlzLm9nKGQucXVlcnlLZXlbaF0saCxiW2hdKTtkLnF1ZXJ5S2V5W2hdPWN9az1bXTtmb3IoaCBpbiBkLnF1ZXJ5S2V5KWsucHVzaChoKyI9IitkLnF1ZXJ5S2V5W2hdKTtyZXR1cm4gYz1kLmhvc3QrZC5wYXRoKyI/IitrLmpvaW4oIiYiKX0sTnM6ZnVuY3Rpb24oYSl7dGhpcy5VYiYmKGErPXRoaXMuVWIpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3RoaXMuVGImJihhPXRoaXMuTXMoYSx0aGlzLlRiKSk7cmV0dXJuIGF9LApjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5kZz0hMDt0aGlzLlhjPWE7dGhpcy5CYT1iO3RoaXMueGU9ZDt0aGlzLnNkPWM7dGhpcy5OYz1lO3RoaXMuSGI9aHx8e307dGhpcy5ycygpO2lmKCJzdHJpbmciPT10eXBlb2YgdGhpcy5CYSl0aGlzLnBzKCk7ZWxzZSB0cnl7dGhpcy5CYT1iKCksdGhpcy5JYygpfWNhdGNoKGwpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fSxaYTpmdW5jdGlvbihhKXt2YXIgYj1udWxsO3RyeXtiPW5ldyBFdmVudChhKX1jYXRjaChkKXtiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGIuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYn0scnM6ZnVuY3Rpb24oKXt0aGlzLklhKG5ldyB6KHRoaXMuWGMrdGhpcy56YygiZ2xvYmFsIikpLHRoaXMuTXEuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQmUoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5JYygpfS5iaW5kKHRoaXMpLAohMCl9LHBzOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnpjKCJjbGllbnQiKSk7dGhpcy5JYShuZXcgeih0aGlzLkJhK3RoaXMuemMoImNsaWVudCIpKSx0aGlzLkljLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjbGllbnQiKTt0aGlzLmhhKCJjbGllbnRDb25maWdDb3VsZE5vdEJlTG9hZGVkIil9LmJpbmQodGhpcyksITApfSx6YzpmdW5jdGlvbihhKXt2YXIgYj0iP2NhY2hlPSIrdGhpcy5uYigpO3RoaXMuSGImJnRoaXMuSGIubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWEmJihiPSIiKTt0aGlzLkhiJiZ0aGlzLkhiLm5vQ2FjaGVCdXN0ZXImJihiPSIiKTtyZXR1cm4gYn0saGE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuSWQpe3RoaXMuSWQ9ITA7dmFyIGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYj0wO2I8YS5sZW5ndGg7YisrKXtpZihhW2JdJiZhW2JdLnBhdXNlJiYiZnVuY3Rpb24iPT0KdHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS5wYXJlbnROb2RlJiZhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGE9d2luZG93LmRvY3VtZW50O2EuaGFzQ2hpbGROb2RlcygpOylhLnJlbW92ZUNoaWxkKGEubGFzdENoaWxkKX07CnRoaXMuTmMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5OYz90aGlzLk5jKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLmFhPXRoaXMuJGY9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuVmUpKTt0aGlzLnViKCk7ZS5aYihrLlN0KTsoYj1lLlFmKHRoaXMuWmMoKSkpfHwoYj1lLlFmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSxNcTpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5CYXx8dGhpcy5JYnx8dGhpcy51YXx8dGhpcy5JYygpOih0aGlzLm9hPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLmFhPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndiKSksdGhpcy51YigpKX19LEljOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihhLmVuYWJsZWQpO3RoaXMuYWE9IXRoaXMuaXNFbmFibGVkO3RoaXMuT2E9YS5zZXJ2ZXJ8fFtdO3RoaXMuSWI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLlRmPWEuYWRwYXRofHwiIjt0aGlzLk5kPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuSWc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuT2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYiYmdGhpcy51YSYmdGhpcy5PYS5sZW5ndGg/dGhpcy5iZCghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5hYT0hMCwKZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSx0aGlzLnViKCkpfSxiZDpmdW5jdGlvbihhKXtpZighdGhpcy5hYSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy56ZSgpKSxjPXRoaXMuSmEodGhpcy5JYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkliK3RoaXMuemMoImN1c3RvbWVyIikpO3RoaXMuSWEoYix0aGlzLmF2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLkJlKCJjdXN0b21lciIpO2E/dGhpcy5FbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLkVsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iZCghMCl9LmJpbmQodGhpcyksCjEwMCkpOnRoaXMuYmQoITApfS5iaW5kKHRoaXMpLCEwKX19LGF2OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmFhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7fXRoaXMucmQ9dGhpcy5NYihiLnN0cmljdCk7dGhpcy5OZT10aGlzLk1iKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFmPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5ZYj10aGlzLk1iKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5NYihiLmVuYWJsZWQpO3RoaXMuS2I9Yi50ZXN0aGlkZXx8IiI7dGhpcy5yYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuTGI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5VYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlRiPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5IZD1iLmFkdGFncmVnZXh8fApudWxsO3RoaXMuaWc9Yi5qc3BvcHVwc3x8ITE7dGhpcy5xYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5wYz1iLnZwYWlkfHwhMTt0aGlzLkhiLnZwYWlkPXRoaXMucGM7dGhpcy5OZz1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkVjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5KYj1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLkhxKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy5OZCYmKHRoaXMuSmI9bnVsbCk7dGhpcy5MZT1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLlhkJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5YZD0hMCx0aGlzLmJkKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnN2KCkmJih0aGlzLktifHx0aGlzLkxifHx0aGlzLnJifHx0aGlzLkpiKT90aGlzLnhlPyh0aGlzLm9hPXRoaXMuYWE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMud2IpKSwKdGhpcy5KZCgpLHRoaXMudWIoKSk6dGhpcy5odigpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLml2KCkpfX0saHY6ZnVuY3Rpb24oKXt0aGlzLmd2KCl9LGl2OmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKX0scWQ6ZnVuY3Rpb24oYSl7dGhpcy50Yz0hMDt0aGlzLmFhfHwodGhpcy5hYT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYShhKSksdGhpcy51YigpLHRoaXMuSmQoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5LYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5LYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLktiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5xZCh0aGlzLnJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5VZygpfWVsc2UgdGhpcy5VZygpfSxUZzpmdW5jdGlvbigpe3ZhciBmO3ZhciBjO2Z1bmN0aW9uIGEoKXtmPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5uYigpKTt0aGlzLmx2KGYsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5IZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMucWQodGhpcy5yYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfXRoaXMucmI9bnVsbCx0aGlzLkhlKCl9LGx2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7ZSgpJiYKYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5JYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0sVWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubmIoKSk7dGhpcy5tdihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuVGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLnFkKHRoaXMucmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuTGImJnRoaXMuTGIubGVuZ3RoKXt2YXIgYz10aGlzLkxiLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuVGcoKX0sbXY6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGYoKXtoKCkmJmIoKX1mdW5jdGlvbiBlKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gbD8od2luZG93LmNsZWFyVGltZW91dChsKSwhMCk6ITF9dmFyIGw9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWU7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixlKX1jYXRjaChtKXtmKCl9fSxIZTpmdW5jdGlvbigpe3RoaXMuSmI/KHRoaXMuS2UrKyx0aGlzLklhKG5ldyB6KHRoaXMuSmIpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuSWUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5SZygpfSxJZTpmdW5jdGlvbihhKXt0aGlzLnFkKHRoaXMuV2UsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuS2U/dGhpcy5IZSgpOnRoaXMuSWUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlJnKCk6dGhpcy5JZSgiQUFBIil9LFJnOmZ1bmN0aW9uKCl7dGhpcy5hYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy53YikpO3RoaXMudWIoKTt0aGlzLkpkKCl9LHViOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMudGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLlhlKSk7CnRoaXMuc2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5zZCYmdGhpcy5zZCgpfSxNbzpmdW5jdGlvbigpe2lmKHRoaXMuTmUmJnRoaXMuVnEoKSl7dmFyIGE9dGhpcy54cSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sV2c6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsYyxmLGgsRCl7YT1uZXcga2IoYSxiLGMpO2YmJihhLmxoPSEwKTtoJiZlLlRyKCkmJihhLkhmPSEwKTtEJiYoYS5RZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxuZjpmdW5jdGlvbigpe2UuWWEoKXx8ZS5NYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMuaGEoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLmdjKCl8fChhPXRoaXMuSmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTsKaC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5oYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5oYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sTG86ZnVuY3Rpb24oKXt0aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLkdhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLAohMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5JYShhLHRoaXMuJHYuYmluZCh0aGlzKSx0aGlzLlp2LmJpbmQodGhpcykpfSwkdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWN8fHRoaXMuY3EoKX0sWnY6ZnVuY3Rpb24oKXt9LGNxOmZ1bmN0aW9uKCl7ZS5aYihrLmJxKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxKZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLnFiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMucWIubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMucWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuTWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLmZjKCldPXRoaXM7ZS5NYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSx0aGlzKX19fSxzdjpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLkxlfSxIcTpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+Ck1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxNYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSx6YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxsLGssbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGg9Yz4+MixjPShjJjMpPDw0fGY+PjQsbD0oZiYxNSk8PDJ8ZT4+NixrPWUmNjMsaXNOYU4oZik/bD1rPTY0OmlzTmFOKGUpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKTtyZXR1cm4gYn0sSmE6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgYz17fSxmPTE0O2YtLTspY1tiW2ZdXT1hW2ZdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLApmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30sTWc6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksaz0xNzMyNTg0MTkzLGw9NDAyMzIzMzQxNyxtPTI1NjIzODMxMDIscT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx3LHUseDtuPWEubGVuZ3RoO3ZhciB5PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCllPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHkucHVzaChlKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPQphLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih5LnB1c2goZik7MTQhPXkubGVuZ3RoJTE2Oyl5LnB1c2goMCk7eS5wdXNoKG4+Pj4yOSk7eS5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHkubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09eVthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWMoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7ZT1rO249bDtwPW07dz1xO3U9cjtmb3IoZj0wOzE5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfH5uJncpK3UraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj0yMDszOT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LAp1PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTQwOzU5Pj1mO2YrKyl4PWMoZSw1KSsobiZwfG4md3xwJncpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj02MDs3OT49ZjtmKyspeD1jKGUsNSkrKG5ecF53KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7az1rK2UmNDI5NDk2NzI5NTtsPWwrbiY0Mjk0OTY3Mjk1O209bStwJjQyOTQ5NjcyOTU7cT1xK3cmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1fXJldHVybihiKGspK2IobCkrYihtKStiKHEpK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBsYj1jLnJqfHxsYixtPW5ldyBsYjt3aW5kb3cudHg9bTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vdT10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbN107CnRoaXMuRW49dGhpcy5hWzZdO3RoaXMuUXE9dGhpcy5hWzJdO3RoaXMueWs9dGhpcy5hWzVdO3RoaXMudWk9dGhpcy5hWzNdO3RoaXMuaT10aGlzLmFbN119Yy5GaT1iO2IucHJvdG90eXBlPXtudTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub3U6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJvOnRoaXMuRG4oYSl9LERuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Fbjp0aGlzLlBxKGEpfSxQcTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUXE6dGhpcy54ayhhKX0seGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlrOnRoaXMudGkoYSl9LHRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy51aTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmk6YX19fSkoYyk7dmFyIG1iPWMuRml8fG1iLFhjPW5ldyBtYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1YYy5udSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjKXt0aGlzLmY9YTthLnUuTD90aGlzLk5hPWEudS5MKCk6dGhpcy5OYT0iIjt0aGlzLmNvbnRhaW5lcj10aGlzLmYuVGE7dGhpcy5wbGF5ZXI9dGhpcy5mLnU7dGhpcy5BYj10aGlzLkNjPSExO3RoaXMubm89MUUzO3RoaXMuZGE9bnVsbDt0aGlzLlA9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5vZD17fTt0aGlzLkFjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuQWM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5mLnUpJiZ0aGlzLmYudS5CJiYoYT10aGlzLmYudS5CKCkpLHRoaXMuQWM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7CnRoaXMubmQ9ITE7dGhpcy5sZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5tPXt9O3RoaXMueWM9ITE7dGhpcy5aZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkRiPSExO3RoaXMuaXA9ZS5wYSgxMCk7dGhpcy5kZD1lLnBhKDEwKTt0aGlzLm1lPWUucGEoMTApO3RoaXMuT2c9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuWGI9dGhpcy5rYj0hMTt0aGlzLlFkPW51bGw7dGhpcy5aZD10aGlzLnVlPXRoaXMuS2Q9dGhpcy5NYz10aGlzLkdlPXRoaXMudmc9dGhpcy5RYz10aGlzLnl2PXRoaXMuYWI9ITF9Yy5saj1iO2IucHJvdG90eXBlPXtKZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxYZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09CmUuSGEmJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsIiIsITApO3RoaXMuUC50Yz9lLnRyYWNrKCJhZGNhbGwiLCIxIik6ZS50cmFjaygiYWRjYWxsIiwiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQoay5tbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpfSxnZTpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuUC5hYSl0aGlzLlAuTW8oKSx0aGlzLlAub2EmJnRoaXMuUC5pc0VuYWJsZWQ/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5QLnBjfSkpOmI/KHRoaXMuWGcoKSxuZXcgVSh0aGlzLGEsdGhpcy5sZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUC5wYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuQ2EoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YuZ2UoYSwKYixjKX0sNTApfX0sc2U6ZnVuY3Rpb24oYSl7dGhpcy5RYz0hMTt0aGlzLm09YTt0aGlzLlB1KHRoaXMubSk7dGhpcy5SZihhKX0sUmY6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMub2Q9dGhpcy5KcShhKSksdGhpcy5SZihhLnBhcmVudCkpfSxKcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWil7Yj1hLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5aLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLlouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmCihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuVmEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0sZ2E6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLk9jJiZhLk9jLmVycm9yJiZhLk9jLmVycm9yLmNvZGUmJihiPWEuT2MuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2UgeC5xYy5jb2RlOmI9PUUueGQuY29kZT9lLkQoay50dyx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpOihlLmhlKCksYj09RS4kZS5jb2RlJiZlLkQoay5Ucyx0aGlzLm0uUix0aGlzLmYudS5CKCksCnRoaXMuVCgpKSk7ZS5EKGsuYXEsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB4LlllLmNvZGU6ZS5EKGsuYXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB4LmFmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS5EKGsuQXcsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2UgeC55ZC5jb2RlOmUuRChrLkp3LHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7Yz0ic3RhdHNfaGRfYWRfZXJyb3JfeG1scGFyc2UiO2JyZWFrO2Nhc2UgeC53ZC5jb2RlOmUuRChrLlVzLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSksZS50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLAp0aGlzLlhifHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLmxhJiYoYys9Il8iK2EuZXJyb3IubGEpO2UudHJhY2soYywiIiwhMCk7dGhpcy5CYihhKTt0aGlzLkNhKCl9LEJiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5BYS5sZW5ndGg7KXRyeXt2YXIgYz1hLkFhLnBvcCgpO3RoaXMuZmUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LFB1OmZ1bmN0aW9uKGEpe3RoaXMuS2Q9dGhpcy5aZD10aGlzLnVlPSExO3RoaXMucmE9dGhpcy5mLkc7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmYuQzsKYi5NeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuQW4mJnRoaXMucGxheWVyLlRjKCkmJihiLnZvbHVtZT10aGlzLnBsYXllci5UYygpLzEwMCk7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtmb3IodmFyIGM9MDtjPGEuTS5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5NW2NdLnR5cGUpJiZ0aGlzLnduKGIsYS5NW2NdLnVybCsiIixhLk1bY10udHlwZSk7dGhpcy5WZyhiKT8odGhpcy55bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmRhPQp0aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5kYS5hcHBlbmRDaGlsZChiKSk6dGhpcy5tLmNwKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZGE9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZGEuYXBwZW5kQ2hpbGQoYiksdGhpcy5OdSgpKTp0aGlzLiRkKCk/dGhpcy5MZygpOnRoaXMubS5vcmlnaW4uQmYoeC53ZCl9LE51OmZ1bmN0aW9uKCl7ZS5yZigpO3RoaXMubSYmdGhpcy5tLm9yaWdpbiYmdGhpcy5tLm9yaWdpbi5TZSYmZS56bih0aGlzLm0ub3JpZ2luLlNlKTtlLlFhKCJzZXRVcFZwYWlkIik7dmFyIGE9dGhpcy5mLkM7dGhpcy5mLkM9Qy5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuZi5DLGEpO3RoaXMuZi53ZygpOwp0aGlzLmYubGMoKTtmb3IoYT10aGlzLmYuRzthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5mLmxjKCk7dGhpcy5PPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5mLkcuYXBwZW5kQ2hpbGQodGhpcy5PKTt0aGlzLk8ub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tLkxxKCksYj10aGlzLm0uUi5PcmlnaW5hbEFkUGFyYW1ldGVycywKYz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDphLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTphLmRlc2lyZWRCaXRyYXRlfHxhLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YixjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpifSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmYuRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuZi5HLnN0eWxlLmhlaWdodCl9fX07ZS56YSh0aGlzLk8sImNvbmZpZyIsYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuTywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLk8sImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5PLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnlvKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuUCk7dGhpcy5PLnNyYz1hO2UuRWQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLmt3KGEpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmKHRoaXMubHcoKSx0aGlzLmYuY2MoITApKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmYuY2MoITApLHRoaXMubncoKSksIkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5mLmNjKCEwKSx0aGlzLnJ3KCkpLCJBZFZpZGVvRmlyc3RRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnB3KCksIkFkVmlkZW9NaWRwb2ludCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnF3KCksIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuc3coKSwiQWRWaWRlb0NvbXBsZXRlIj09YS5kYXRhLm5hbWUmJnRoaXMub3coKSwiQWRTdG9wcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuaWgoKSl9LmJpbmQodGhpcykpOwplLkVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkNhKCl9LmJpbmQodGhpcykpO2UuRWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5DYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmYudG4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxudzpmdW5jdGlvbigpe3RoaXMudHJhY2soImNyZWF0aXZlVmlldyIpfSxsdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlFhKCJpbXByZXNzaW9uIil9LHJ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlFhKCJzdGFydCIpfSxwdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTtlLlFhKCJmaXJzdFF1YXJ0aWxlIil9LHF3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLlFhKCJtaWRwb2ludCIpfSxzdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlFhKCJ0aGlyZFF1YXJ0aWxlIil9LApvdzpmdW5jdGlvbigpe3RoaXMudGQoKTtlLlFhKCJjb21wbGV0ZSIpfSxpaDpmdW5jdGlvbihhKXtpZih0aGlzLk8mJnRoaXMuTy5wYXJlbnROb2RlJiZ0aGlzLk8ucGFyZW50Tm9kZS5wYXJlbnROb2RlKXtlLlFhKCJhZHN0b3BwZWQiKTt2YXIgYj10aGlzLk8ucGFyZW50Tm9kZTt0aGlzLk8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLk8pO2IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTt0aGlzLk89ZS5iYT0hMTt0aGlzLkNhKGEpfX0sa3c6ZnVuY3Rpb24oYSl7ZS50cmFjaygic3RhdHNfdnBfZXJyb3JoYW5kbGVyIixhLm1lc3NhZ2UsITApO2UuUWEoImVyciIsYS5tZXNzYWdlKTt0aGlzLmloKCEwKX0sd246ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5QO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5nYygpPyhmPWUuSmEoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsCiJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuY3cuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxWZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LHluOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLmhoLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuUGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuaGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsCnRoaXMuUGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLlFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMudGQuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy51ZC5iaW5kKHRoaXMpKX0saGg6ZnVuY3Rpb24oYSl7dGhpcy5BYnx8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFifHx0aGlzLlBlKGEpfS5iaW5kKHRoaXMpLHRoaXMubm8pKX0sUGU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuQ2MmJnRoaXMuVmcodGhpcy52aWRlbykmJiF0aGlzLmtiJiYhdGhpcy5BYil7dGhpcy5DYz0hMDt0cnl7aWYoIWUuWWEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMubS5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMua2J8fCh0aGlzLmtiPSEwLHRoaXMuaGQodGhpcy52aWRlbyksCmUudHJhY2soInN0YXRzX2hkX25vb3B2aWRlbyIsIiIsITApLHRoaXMuUC5BZnx8dGhpcy5QLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuQ2EoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIiwiIiwhMCl9dGhpcy5idygpO3RoaXMudmlkZW8uY29udHJvbHM9ITE7dGhpcy5mLmxjKCk7dGhpcy5laCgpO3RoaXMuZmgoKTt0aGlzLmxmKCk7dGhpcy5mLndnKCk7dGhpcy52aWRlby5wbGF5JiZ0aGlzLkZlKCl9fSxGZTpmdW5jdGlvbigpe2lmKCF0aGlzLk1jKWlmKHRoaXMuY29uZi5wcmVBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnByZUFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuSGEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuWWM9W107Zm9yKHZhciBiPXRoaXMuZi5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLlljLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PQoibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSk7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMueGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsCmIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhjKCl9ZWxzZSB0aGlzLnhjKCl9LHhjOmZ1bmN0aW9uKGEpe2lmKHRoaXMuWWMpZm9yKHZhciBiPTA7Yjx0aGlzLlljLmxlbmd0aDtiKyspdGhpcy5ZY1tiXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGI9dGhpcy52aWRlby5wbGF5KCkpJiZiWyJjYXRjaCJdKWJbImNhdGNoIl0oZnVuY3Rpb24oYil7dGhpcy5NY3x8KGE/KCJzdHJpbmciIT10eXBlb2YgYiYmYiYmYi5tZXNzYWdlJiYoYj1iLm1lc3NhZ2UpLHRoaXMuQ2EoKSxlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsYiwhMCkpOih0aGlzLnBnKCEwKSx0aGlzLnhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLlpkJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy51ZT0hMH0uYmluZCh0aGlzKSk7CmNhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5GYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLkZiLmJpbmQodGhpcykpKTpKPWZ1bmN0aW9uKCl7dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LmJpbmQodGhpcyk7dGhpcy5UZCgpLktnKHRoaXMpfSx0ZDpmdW5jdGlvbigpe3RoaXMuUC5ZYiYmIXRoaXMua2ImJmUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UuRChrLmduLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dGhpcy5DYSgpfSxDYTpmdW5jdGlvbihhKXtpZighdGhpcy5LZClpZih0aGlzLktkPSEwLHRoaXMubS4kYXx8dGhpcy5tLlBiKXt0aGlzLkFiPXRoaXMuQ2M9ITE7dHJ5e3RoaXMuaGQodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLmRhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPQp0aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5uZD0hMTt0cnl7dGhpcy5mLmFoKCl9Y2F0Y2goZSl7fXRoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5EYj0hMTt0aGlzLlRkKCkuRWcoKTt0aGlzLm0uJGEmJnRoaXMubS5vcmlnaW4ubmUoKTt0aGlzLm0uUGImJihhP3RoaXMubS5vcmlnaW4ucWcoKTp0aGlzLkxkKCkpfWVsc2UgdGhpcy5MZCgpfSxjdzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuJGQoKT90aGlzLkxnKCk6dGhpcy51ZChhKSl9LHVkOmZ1bmN0aW9uKGEpe3RoaXMuQWI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmCih0aGlzLiRkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhifHx0aGlzLlAubmYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUC5uZigpKTt0aGlzLm0ub3JpZ2luLkJmKHgud2QpfSxRZTpmdW5jdGlvbigpe2lmKHRoaXMueXYpdGhpcy5DYSgpO2Vsc2V7dGhpcy5EYj0hMDt0aGlzLmYudS5sYiYmIXRoaXMuR2UmJnRoaXMuZi51LmxiKCkmJmUuRChrLktjLHRoaXMuZi51LkIoKSx0aGlzLlQoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLkR2KGEpO3ZhciBiPSIiO2lmKHRoaXMubS5FZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5PZyk7YyYmKGI9dGhpcy5tLkVlLWEsMDxiP2I9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYik6KGI9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixiKSx0aGlzLm5kfHwodGhpcy5uZD0hMCxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGsubm4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLm0uJGE/KHRoaXMuQWI9dGhpcy5DYz0hMSx0aGlzLmhkKHRoaXMudmlkZW8pLHRoaXMuZGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmRhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMubmQ9ITEsdGhpcy5mLmFoKCksdGhpcy5tLm9yaWdpbi5uZSgpKTp0aGlzLkNhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9Yil9dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsZS5JZih0aGlzLm0uZHVyYXRpb24tYSkpKTt0aGlzLnljPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxMZzpmdW5jdGlvbigpe3RoaXMuWGI9ITA7dGhpcy5yYT10aGlzLmYuRzt0aGlzLnJhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYT10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWE7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvYmplY3QiKTthLnNldEF0dHJpYnV0ZSgiZGF0YSIsImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2hvbWFkanNmbGFzaGRpc3BsYXkuc3dmIik7YS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuRXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+JzsKdGhpcy5mLkM9YTt2YXIgYj10aGlzLmYuQyxjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmRhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5mLmxjKCk7dGhpcy52aWRlbz10aGlzLmRhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy5yYS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMucmEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyk7dGhpcy5kYS5hcHBlbmRDaGlsZChiKTt0aGlzLmVoKCk7dGhpcy5maCgpO3RoaXMuUWQ9c2V0SW50ZXJ2YWwodGhpcy5Lby5iaW5kKHRoaXMpLAoxMDApO3JldHVybiBhfSxFcTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxiPXt9LGM9MDtjPHRoaXMubS5NLmxlbmd0aDtjKyspe3ZhciBmPWI9dGhpcy5tLk1bY10sZTtlPWIudXJsO3ZhciBoPXRoaXMuUDtoLm9hJiZoLmlzRW5hYmxlZCYmIWguZ2MoKSYmKGU9aC5KYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LEtvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLm0uZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5RZCksdGhpcy50ZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLlFlKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLlFkKSwKdGhpcy51ZCgpKSx0aGlzLnZpZGVvLm11dGVkP3RoaXMudmlkZW8ubXV0ZSgpOnRoaXMudmlkZW8udW5tdXRlKCkpfWNhdGNoKGIpe319LFlnOmZ1bmN0aW9uKCl7dGhpcy52Z3x8KHRoaXMudmc9ITAsdGhpcy5RY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LER2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuWmd8fHRoaXMua2J8fCgwPT1hJiYodGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSksdGhpcy51ZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5aZD0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5ZZygpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuWWcoKX0uYmluZCh0aGlzKSksCnRoaXMuWGImJmUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb25fZmxhc2giLCIiLCEwKSx0aGlzLmtifHxlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIiwiIiwhMCksZS5ZYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS5EKGsuam4sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSxlLkQoay5wbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWGImJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMubS5kdXJhdGlvbi80KSYmKHRoaXMuUC5ZYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuUWM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLkQoay5obix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxhPT0KTWF0aC5mbG9vcih0aGlzLm0uZHVyYXRpb24vMikmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUuRChrLmxuLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLm0uZHVyYXRpb24vNCkmJih0aGlzLlAuWWImJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLkQoay5ybix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKSxlLkQoay5zbix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpLHRoaXMuWmc9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMua2Ipe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH1mb3IodmFyIGM9CnRoaXMuS3EodGhpcy5tLkFhLGEpO2MubGVuZ3RoOyl0cnl7dmFyIGY9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMub2QuaW1wcmVzc2lvbnMmJmUuUnIoZi51cmwsdGhpcy5vZC5pbXByZXNzaW9ucyk/dGhpcy5mZShmLnVybCxmLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS5EKGsua24sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpLHthZElkOnRoaXMub2QuYWRJZCxpbXByZXNzaW9uVVJMOmJ9KX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLmZlKGYudXJsLGYudHlwZSl9Y2F0Y2goaCl7fWJ8fCh0aGlzLm0uQWE9dGhpcy5ycCh0aGlzLm0uQWEsYSkpfX0sZmU6ZnVuY3Rpb24oYSxiLGMsZil7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGE9dGhpcy5QLkdhKGEpLGMmJmEudm4oYyksZnx8KGY9dGhpcy56ZiksdGhpcy5QLklhKGEsZix0aGlzLnpmLCExLCEwKSl9LEtxOmZ1bmN0aW9uKGEsCmIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LHJwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LGJ3OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO3RoaXMudmlkZW8ub25jbGljaz10aGlzLmdoLmJpbmQodGhpcyl9LGdoOmZ1bmN0aW9uKCl7ZS5EKGsuWm8sdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKTt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7IXRoaXMuUWMmJmUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfY2xpY2t0aHJvdWdoQmVmb3JlMXN0UXVhcnRpbGUiLGUuc3EoKSwhMCk7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUC5vYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjthLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5tLkhjfWNhdGNoKGIpe3dpbmRvdy5vcGVuKHRoaXMubS5IYywKdGhpcy5QLm9hPyJfdG9wIjoiX2JsYW5rIil9fSxlaDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGEuc3R5bGUuZm9udFNpemU9IjlweCIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkFjLnJlcGxhY2UoIlt0aW1lXSIsCmUuSWYoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuUC5FYyYmKGI9dGhpcy5QLkVjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFjLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLmRhLmFwcGVuZENoaWxkKGEpfX0sYWM6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sa2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuUC5FYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGZoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5pcDt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPQoicmVsYXRpdmUiLGIuc3R5bGVbImZsb2F0Il09ImxlZnQiLGIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yi5pZD10aGlzLmRkO2IuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLkF2LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPQoicG9pbnRlciIpO2MuaWQ9dGhpcy5tZTtjLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbjtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnp2LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTsKZi5pZD10aGlzLk9nO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9MSl9KTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhciBhPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpO2EmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7Zi5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLm0uRWUmJmEuYXBwZW5kQ2hpbGQoZik7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubGQoKTt0aGlzLmtkKCl9LmJpbmQodGhpcykpO3RoaXMuZGEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuYWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz0KdGhpcy5kYS5hcHBlbmRDaGlsZChhKTt0aGlzLmYudS52YSYmdGhpcy5mLnUudmEoKSYmdGhpcy5wZygpO3RoaXMuYmMoKX19LGJjOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbGQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sQXY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTt0aGlzLmYuQy5wYXVzZWQ/KHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSk6KHRoaXMuZi5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQoay5mZix0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpKX0scWU6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmRkKTsKdGhpcy5mLkMucGF1c2VkfHwodGhpcy5mLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUuRChrLmZmLHRoaXMubS5SLHRoaXMuZi51LkIoKSx0aGlzLlQoKSkpfSx3dTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZGQpO3RoaXMuZi5DLnBhdXNlZCYmKHRoaXMuZi5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS5EKGsuZ2YsdGhpcy5tLlIsdGhpcy5mLnUuQigpLHRoaXMuVCgpKSl9LHp2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tZSk7dGhpcy5mLkMubXV0ZWQ/KHRoaXMuZi5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOgoodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCkpfSxwZzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMubWUpO3RoaXMuZi5DLm11dGVkfHwodGhpcy5mLkMubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxGYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkZiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5GYik7dGhpcy5NY3x8dGhpcy55Y3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuRmUoKSl9LApMZDpmdW5jdGlvbigpe3RoaXMuTWM9ITA7dGhpcy5hYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5hYiksdGhpcy5hYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5IYSYmdGhpcy55Y3x8InBvc3Ryb2xsIj09ZS5IYSkmJnRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wb3N0QWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZS5IYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7Zm9yKHZhciBiPXRoaXMuZi5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmYubGMoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpOwpiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuTWQoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy5NZCgpfWVsc2UgdGhpcy5NZCgpfSxNZDpmdW5jdGlvbigpe3RoaXMuR2U9ITA7dGhpcy5mLldkKCk7dGhpcy5mLnh1KCk7dGhpcy5EYj0hMTtlLkQoay5ocCx0aGlzLm0uUix0aGlzLmYudS5CKCksdGhpcy5UKCkpO3RoaXMuVGQoKS5FZygpfSxUZDpmdW5jdGlvbigpe3ZhciBhPQpudWxsO3RoaXMuZiYmdGhpcy5mLnUmJihhPXRoaXMuZi51KTtyZXR1cm4gYX0sJGQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJihhPSEwKX1jYXRjaChiKXtuYXZpZ2F0b3IubWltZVR5cGVzJiZ2b2lkIDAhPW5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0mJm5hdmlnYXRvci5taW1lVHlwZXNbImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIl0uZW5hYmxlZFBsdWdpbiYmKGE9ITApfXJldHVybiBhfSxsZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihlLmJnKHRoaXMudmlkZW8sYSk/dGhpcy53dSgpOnRoaXMucWUoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGYoKX0uYmluZCh0aGlzKSwxMDApKX0sVDpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMubSYmKGEuY2xpY2t0aHJvdWdoPXRoaXMubS5IYywKYS5kdXJhdGlvbj10aGlzLm0uZHVyYXRpb24sYS5hZFBvZD10aGlzLm0uJGEsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSkpO3JldHVybiBhfSx6ZjpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFA9Yy5sanx8UDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5lbT10aGlzLmFbNl07dGhpcy5Mdj10aGlzLmFbM107dGhpcy5hcD10aGlzLmFbN107dGhpcy5VdD10aGlzLmFbM107dGhpcy5tcT10aGlzLmFbM107dGhpcy5LaD10aGlzLmFbMV07dGhpcy5pPXRoaXMuYVsxXX1jLmJwPWI7Yi5wcm90b3R5cGU9e2RtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5lbTp0aGlzLkt2KGEpfSxLdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTHY6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5hcDp0aGlzLlR0KGEpfSxUdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVXQ6dGhpcy5scShhKX0sbHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1xOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2g6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBuYj1jLmJwfHxuYixZYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1ZYy5kbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307Zz1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkxhPW51bGw7dGhpcy5XPVtdO3RoaXMuWj1udWxsO3RoaXMuUWI9dGhpcy5SYj0hMTt0aGlzLlNlPSIiO3RoaXMuUmU9ITE7ZCYmZC5lbXB0eT90aGlzLnVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLnRtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLndmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2UmJigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbSYmKGE9ZS50Zih0aGlzLnVybCksMDxhLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIik/KHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5wZChhKSkrIiZ0eXBlPWpzIiwKYj1tLkdhKG0ucGQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPW0uR2EobS5wZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSksYi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiKTttLklhKGIsdGhpcy50cy5iaW5kKHRoaXMpLHRoaXMucXMuYmluZCh0aGlzKSl9LEpmOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLkxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09CmUuSGEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5MYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuSGF8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYKInBvc3Ryb2xsIj09ZS5IYSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZD0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWQuZmlyc3RDaGlsZH1jYXRjaChnKXt9ZWxzZSBjLnNwbGljZShiLDEpfSk7YT1hLmNvbmNhdChiKTthLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6LTF9KTtyZXR1cm4gYX0sCnRzOmZ1bmN0aW9uKGEpe3RoaXMubXUoYSk7dHJ5e3RoaXMuTGE9YS5yZXNwb25zZVhNTCx0aGlzLkxhfHwodGhpcy5MYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5nYSh0aGlzLkRhKHgueWQpKX10aGlzLlc9dGhpcy5KZigpO3RoaXMuUmI9dGhpcy5KZSgpO3RoaXMuUWI9dGhpcy5TZygpO3RoaXMuVy5sZW5ndGg/dGhpcy5pYygpOnRoaXMuZ2EodGhpcy5EYSh4LnFjLHtlcnJvcjp0aGlzLlJlP0UueGQ6RS5aZX0pKX0sdXM6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuTGF8fCh0aGlzLkxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZ2EodGhpcy5EYSh4LnlkKSl9dGhpcy5XPXRoaXMuSmYoKTt0aGlzLlJiPXRoaXMuSmUoKTt0aGlzLlFiPXRoaXMuU2coKTt0aGlzLlcubGVuZ3RoP3RoaXMuaWMoKTp0aGlzLmdhKHRoaXMuRGEoeC5xYywKe2Vycm9yOnRoaXMuUmU/RS54ZDpFLlplfSkpfSxxczpmdW5jdGlvbigpe3RoaXMuZ2EodGhpcy5EYSh4LlllLHtkZXB0aDphfSkpfSxpYzpmdW5jdGlvbigpe3RoaXMuWj10aGlzLlcuc2hpZnQoKTt0aGlzLldyKCk/dGhpcy5udigpPyhhKyssbmV3IGIodGhpcyx0aGlzLlNmKCksZyx7QWRTeXN0ZW06dGhpcy5xcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKTp0aGlzLmdhKHRoaXMuRGEoeC5hZikpOihhPTAsdGhpcy5YdigpJiZ0aGlzLnNlKHRoaXMua3AoKSkpfSxuZTpmdW5jdGlvbigpe3RoaXMuUmI/KHRoaXMuUmI9MTx0aGlzLlcubGVuZ3RoLHRoaXMuVy5sZW5ndGgmJnRoaXMuaWMoKSk6dGhpcy5wYXJlbnQubmUoKX0scWc6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLlFiPTE8dGhpcy5XLmxlbmd0aCx0aGlzLlcubGVuZ3RoJiZ0aGlzLmljKCkpOnRoaXMucGFyZW50LnFnKCl9LFh2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua3YoKT90aGlzLmp2KCk/ITA6KC0xIT10aGlzLiRiKCk/CnRoaXMuZ2EodGhpcy5EYSh4LlVlKSk6dGhpcy5nYSh0aGlzLkRhKHguaGkpKSwhMSk6KHRoaXMuZ2EodGhpcy5EYSh4LnFjLEUuJGUpKSwhMSl9LHNlOmZ1bmN0aW9uKGEpe2EuQWE9YS5BYS5jb25jYXQodGhpcy5qZSgpKTthLiRhPWEuJGE/YS4kYTp0aGlzLlJiO2EuUGI9YS5QYj9hLlBiOnRoaXMuUWI7dGhpcy5wYXJlbnQuc2UoYSl9LGtwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IG9iO2EuZHVyYXRpb249dGhpcy4kYigpO2EuTT10aGlzLk9mKCk7YS5IYz10aGlzLnRxKCk7YS5vcmlnaW49dGhpczthLlI9dGhpcy5wcSgpO2EuRWU9dGhpcy5JcShhLmR1cmF0aW9uKTtyZXR1cm4gYX0sZ2E6ZnVuY3Rpb24oYil7dGhpcy5aJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguVWUuY29kZT9iLkFhLmNvbmNhdCh0aGlzLnZxKCkpOmIuQWEuY29uY2F0KHRoaXMuQ3EoKSkpO3RoaXMuVy5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5CYiYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LkJiJiYKdGhpcy5wYXJlbnQuQmIoYiksYT0wLHRoaXMuaWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5nYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmdhJiZ0aGlzLnBhcmVudC5nYShiKSxhPTApfSxCYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5CYihhKX0sQmY6ZnVuY3Rpb24oYSxiKXt0aGlzLmdhKHRoaXMuRGEoYSxiKSl9LERhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IHBiKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sbnY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxrdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuT2YoKS5sZW5ndGh9LGp2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy4kYigpfSxKZTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVy5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9CiExO3RoaXMuVyYmMjw9dGhpcy5XLmxlbmd0aCYmIXRoaXMuSmUoKSYmKGE9ITApO3JldHVybiBhfSxtdTpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMuU2U9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLlJlPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LFdyOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5TZigpLmxlbmd0aH0sU2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5TZCh0aGlzLlosIlZBU1RBZFRhZ1VSSSIpfSxxcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlNkKHRoaXMuWiwiQWRTeXN0ZW0iKX0samU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9WyJJbXByZXNzaW9uIiwiVHJhY2tpbmciLCJDbGlja1RyYWNraW5nIiwiRXJyb3IiXSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz0KYS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5WYShhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LENxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LHZxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5qZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx0cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZhKHRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxPZjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLApEYzphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0Iikscng6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMuVmEoYVtjXSl9KTt0cnl7dmFyIGQ9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoNzAwLWEuRGMpLU1hdGguYWJzKDcwMC1iLkRjKX0pLGI9ZC5jb25jYXQoZyl9Y2F0Y2goZSl7fXJldHVybiBifSxwcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuWi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7CmEmJjAhPWEubGVuZ3RofHwoYT10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsZz0iIixlPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtnPWI9dGhpcy5XYyhhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGcpfTE8YS5sZW5ndGg/KGI9ZCxoPWcpOihiPWMsaD1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sJGI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5WYSh0aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLGE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LElxOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGM9ITEsZD0hMTt0cnl7Yz10aGlzLlouZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLApkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZyl7Yj0hMX1yZXR1cm4gYn0sU2Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlZhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxVZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVmE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5XYyhhKToiIn0sV2M6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5VZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBVPWMudG18fFU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLmtxPXRoaXMuYVs3XTt0aGlzLkNwPXRoaXMuYVs5XTt0aGlzLk1wPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbM107dGhpcy5pPXRoaXMuYVs3XX1jLmh1PWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5HbDp0aGlzLmpxKGEpfSxqcTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua3E6dGhpcy5CcChhKX0sQnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkNwOnRoaXMuTHAoYSl9LExwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5NcDp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSW46dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVpOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaTphfX19KShjKTt2YXIgcWI9Yy5odXx8cWIsWmM9bmV3IHFiKDEsbmV3IERhdGUsMiwKTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLkZsKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMuSGM9IiI7dGhpcy5SPXRoaXMuUGI9dGhpcy4kYT0hMTt0aGlzLm9yaWdpbj1udWxsfWMubWw9YjtiLnByb3RvdHlwZT17Y3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9CnRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sTHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBvYj1jLm1sfHxvYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMTBdO3RoaXMuVG49dGhpcy5hWzldO3RoaXMuRWk9dGhpcy5hWzFdO3RoaXMuTHM9dGhpcy5hWzNdO3RoaXMuZXY9dGhpcy5hWzZdO3RoaXMuams9dGhpcy5hWzVdO3RoaXMuaGo9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbNl19Yy5xbz0KYjtiLnByb3RvdHlwZT17enI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFyOnRoaXMuU24oYSl9LFNuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ubjp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWk6dGhpcy5LcyhhKX0sS3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Mczp0aGlzLmR2KGEpfSxkdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZXY6dGhpcy5payhhKX0saWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmprOnRoaXMuZ2ooYSl9LGdqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5oajp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHJiPWMucW98fHJiLCRjPW5ldyByYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLnpyKDQpOwp2YXIgeD17eWQ6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsbGE6IlhNTF9QQVJTRV9FUlJPUiJ9LGhpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixsYToiRFVSQVRJT05fRVJST1IifSxxYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsbGE6IkVNUFRZX1ZBU1QifSxhZjp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKbGE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LFllOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGxhOiJMT0FEX0VSUk9SIn0sd2Q6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGxhOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCmd4Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGxhOiJNRURJQUZJTEVfRVJST1IifSxVZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixsYToiRFVNTVlfQUQifX0sRT17WmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixsYToiTk9fQURTIn0sJGU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGxhOiJOT19NRURJQUZJTEVTIn0saXg6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsbGE6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSx4ZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixsYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRnQ9dGhpcy5hWzJdO3RoaXMuaW89dGhpcy5hWzFdO3RoaXMuWW09dGhpcy5hWzhdO3RoaXMudmg9dGhpcy5hWzZdO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuaT10aGlzLmFbN119Yy5ndD1iO2IucHJvdG90eXBlPXtFdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRnQ6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuWG0oYSl9LFhtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZbTp0aGlzLnVoKGEpfSx1aDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudmg6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlB0OnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXQ6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBzYj1jLmd0fHxzYixhZD1uZXcgc2IoMSxuZXcgRGF0ZSwyLApNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQuRXQoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5PYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLlJpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgcGI9Yy5SaXx8cGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMuWGo9dGhpcy5hWzFdO3RoaXMuR3I9dGhpcy5hWzddO3RoaXMuY2o9dGhpcy5hWzldO3RoaXMuS2o9dGhpcy5hWzRdO3RoaXMuQXA9dGhpcy5hWzhdO3RoaXMueXc9dGhpcy5hWzNdO3RoaXMuZHg9dGhpcy5hWzddO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLlJvPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVsyXX1jLkNpPWI7Yi5wcm90b3R5cGU9CntDaDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGg6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Yajp0aGlzLkZyKGEpfSxGcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuR3I6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmNqOnRoaXMuSmooYSl9LEpqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Lajp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuQXA6dGhpcy54dyhhKX0seHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnl3OnRoaXMuY3goYSl9LGN4OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5keDp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaGw6dGhpcy5RbyhhKX0sUW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sbzp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciB0Yj1jLkNpfHx0YixiZD1uZXcgdGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1iZC5DaCg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLnU9YTt0aGlzLlRhPWEuS2YoKTt0aGlzLkc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5HLmlkPWUucGEoMTApO3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlVhPXt9O3RoaXMuZmc9ITE7dGhpcy5kYz1bXX1jLnNpPWI7Yi5wcm90b3R5cGU9e0dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCwKZT17fTthLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmKGI9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxjPSJmaXhlZCIsZj1iLmxlZnQsYj1iLnRvcCk7ZT17eDpmLHk6Yn07ZS5wb3NpdGlvbj1jO3JldHVybiBlfSxnZXRQb3NpdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmNvbmYudXNlQm91bmRpbmdDbGllbnRSZWN0KXJldHVybiB0aGlzLkdxKGEpO2Zvcih2YXIgYj0wLGM9MCxmPSExLGU9dGhpcy5QcihhKSxoPXt9O2E7KWIrPWEub2Zmc2V0TGVmdCthLmNsaWVudExlZnQsYys9YS5vZmZzZXRUb3ArYS5jbGllbnRUb3AsYT1hLm9mZnNldFBhcmVudDtlJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8CmRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsTGVmdCxjKz1hLHRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQmJihmPXRoaXMuY29uZi5wb3NpdGlvbklmRml4ZWQpKTtoPXt4OmIseTpjfTtmJiYoaC5wb3NpdGlvbj1mKTtyZXR1cm4gaH0sJHU6ZnVuY3Rpb24oKXt0aGlzLmZnPSEwfSxhaDpmdW5jdGlvbigpe3RoaXMuQz1DLnBvcCgpO3RoaXMuQ3x8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5DPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5DLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sd2c6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtlLkQoay5LYyx0aGlzLnUuQigpKX0seHU6ZnVuY3Rpb24oKXt0aGlzLmZnfHwodGhpcy51LnBsYXkoKSxlLkQoay5MYyx0aGlzLnUuQigpKSl9LGxjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYKKGE9dGhpcy5jb25mLnpJbmRleCk7dGhpcy51LnBhdXNlKCk7dGhpcy5HLnN0eWxlLnpJbmRleD1hO3RoaXMuRy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjt0aGlzLkcuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9IiMwMDAwMDAiO3RoaXMuRy5zdHlsZS5ib3hTaXppbmc9dGhpcy5UYS5zdHlsZS5ib3hTaXppbmc7dGhpcy5HLnN0eWxlLndpZHRoPXRoaXMuVGEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRy5zdHlsZS5oZWlnaHQ9dGhpcy5UYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlRhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuVGEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuVGEpO3RoaXMudS5HYiYmdGhpcy51LkdiKCk/dGhpcy51LktmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2MuYmluZCh0aGlzKSwxMCl9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy51LmV4aXRGdWxsc2NyZWVuKCl9LFByOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSxjPSExO2E7KXtpZihhLnN0eWxlJiYoImZpeGVkIj09YS5zdHlsZS5wb3NpdGlvbnx8YiYmImZpeGVkIj09d2luZG93LmdldENvbXB1dGVkU3R5bGUoYSkucG9zaXRpb24pKXtjPSEwO2JyZWFrfWE9YS5wYXJlbnROb2RlfXJldHVybiBjfSx1cTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LGNjOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudXEodGhpcy5UYSk7aWYoYi54IT10aGlzLlVhLnh8fGIueSE9dGhpcy5VYS55fHwKYi5wb3NpdGlvbiE9dGhpcy5VYS5wb3NpdGlvbnx8Yi53aWR0aCE9dGhpcy5VYS53aWR0aHx8Yi5oZWlnaHQhPXRoaXMuVWEuaGVpZ2h0fHxhKXtpZigwPHRoaXMuVWEud2lkdGgmJjA8dGhpcy5VYS5oZWlnaHQmJjA9PWIud2lkdGgmJjA9PWIuaGVpZ2h0KXt0aGlzLldkKCk7cmV0dXJufXRoaXMuVWE9Yjt0aGlzLnUuR2IoKT8odGhpcy5HLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5HLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuRy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuRy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuRy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmRjLmxlbmd0aDthKyspdGhpcy5kY1thXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9d2luZG93LnNldFRpbWVvdXQodGhpcy5jYy5iaW5kKHRoaXMpLDEwKX0sdG46ZnVuY3Rpb24oYSl7dGhpcy5kY3x8KHRoaXMuZGM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmRjLnB1c2goYSl9LFdkOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTtmb3IodmFyIE89Yy5zaXx8TyxDPVtdLHViPTA7MTAwPnViO3ViKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD1lLnBhKDEwKTtNLmNvbnRyb2xzPSEwO0MucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLApCKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixCKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdD10aGlzLmFbN107dGhpcy5Haz10aGlzLmFbNF07dGhpcy53dj10aGlzLmFbMl07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5XdD10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbNV19Yy56dD1iO2IucHJvdG90eXBlPXtDdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRHQ6dGhpcy5GayhhKX0sRms6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkdrOnRoaXMudnYoYSl9LHZ2OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud3Y6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkttOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuV3Q6CnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuaTphfX19KShjKTt2YXIgdmI9Yy56dHx8dmIsY2Q9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2QuQ3QoNCk7KGZ1bmN0aW9uKGMpe2MuWms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuUyhhKTt0aGlzLkRlKGIpO3RoaXMueGYoKX0sRGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHhmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5FYSgpLGE9dGhpcy52aWRlb1RhZzthfHwKKChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlUoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhmKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LCRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sTDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7CnJldHVybiBiP2IubXV0ZWQ6ITB9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkVhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgd2I9Yy5aa3x8d2I7KGZ1bmN0aW9uKGMpe2MuWWs9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRhKCk7dGhpcy55Yj10aGlzLnlifHwhMTt0aGlzLmVmPXRoaXMuaGY9dGhpcy5YZj10aGlzLmphPXRoaXMuTWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5mcShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELAoiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLk1lPSEwO3RoaXMuWGYmJnRoaXMucWYoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLkRiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuRmMoKTt0aGlzLlhmPSEwO3RoaXMucWYoKX0uYmluZCh0aGlzKSk7dGhpcy5tZigpfSxxZjpmdW5jdGlvbigpe2lmKCF0aGlzLnliKXt0aGlzLkZjKCk7aWYoIXRoaXMuTWUmJiF0aGlzLkZjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5NZSYmdGhpcy5lZiYmIXRoaXMuaGYmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYygpfS5iaW5kKHRoaXMpLAoxMDApfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LFBmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LG1mOmZ1bmN0aW9uKCl7aWYodGhpcy5GYygpKXt2YXIgYj10aGlzLlBmKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuaGY9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5lZj1iLm54fXRoaXMuaWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1mKCl9LmJpbmQodGhpcyksMTAwKX0sdXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLkh4KCk6ITF9LCRiOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi4kYigpOi0xfSxEcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxmcTpmdW5jdGlvbihiLGEpe3RoaXMueWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy55Ynx8MzAyPT10aGlzLnliP3RoaXMuamE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnliKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfSxKYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5qYT8odGhpcy5vKCksdGhpcy5uYSgpKTpiLiRjKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wYigpfS5iaW5kKHRoaXMpLAoyRTMpKTp0aGlzLkRxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSmMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHhiPWMuWWt8fHhiOyhmdW5jdGlvbihjKXtjLiRrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sVXI6ZnVuY3Rpb24oKXt3aW5kb3cuT08ucWwuYW4uWm0/d2luZG93Lk9PLnFsLmFuLlptLmx4KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlVyKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLnhhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRmEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9Cm5ldyB3YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgeGIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHliPWMuJGt8fHliLHpiPW5ldyB5YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zcj10aGlzLmFbNV07dGhpcy5YbD10aGlzLmFbNF07dGhpcy5ieD10aGlzLmFbNF07dGhpcy5acD10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs4XX1jLllxPWI7Yi5wcm90b3R5cGU9e1hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWXI6dGhpcy5XbChhKX0sV2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhsOnRoaXMuYXgoYSl9LGF4OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ieDp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6CnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5NaDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIEFiPWMuWXF8fEFiLGRkPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWRkLlhyKDQpOyhmdW5jdGlvbihjKXtjLk5sPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlUoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9LEdiOmZ1bmN0aW9uKCl7dmFyIGI9bDtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFY9Yy5ObHx8VjsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt5LkRkKCIjIitiLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5vLmJpbmQodGhpcyksMUUzKX0uYmluZCh0aGlzKSk7eS5EZCgiIyIrYiwiYWRzTWFuYWdlckxvYWRGYWlsIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwiYWRzTWFuYWdlckxvYWRGYWlsIik7dGhpcy53KCl9LmJpbmQodGhpcyksCjFFMyl9LmJpbmQodGhpcykpO3kuRGQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5kdChhKX0uYmluZCh0aGlzKSk7eS5VcSgpfSxkdDpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fDMwMz09YltjXXx8NDAzPT1iW2NdKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJihhPWlzTmFOKGJbY11bZF0pPyExOmJbY11bZF0sMTAwOT09YltjXVtkXXx8MTAwMT09YltjXVtkXXx8MzAzPT1iW2NdW2RdfHw0MDM9PWJbY11bZF0pKXt0aGlzLm8oKTt0aGlzLm5hKCk7cmV0dXJufX10aGlzLmwoImFkZXJyb3IiLGEpO3RoaXMudygpfX0pfSkoYyk7dmFyIFc9Yy5NbHx8VzsoZnVuY3Rpb24oYyl7Yy5PbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LApiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuY2QmJihiPWUud3AoYix0aGlzLmNkKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGQ9YlthXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFYoZCk7aWYoIXRoaXMuSChkKSl7dGhpcy5KKGQpO3ZhciBmPW5ldyBXKGQsdGhpcy5BKTtmLmIoKX19Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxoPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGgpdHJ5e3RmbXN1aXRlKCIjIitoKS50Zm12aWRlbygicmVzdW1lIiksdGhpcy5jZHx8Cih0aGlzLmNkPVtdKSx0aGlzLmNkLnB1c2goYlthXSksZD1uZXcgVihoKSx0aGlzLkgoZCl8fCh0aGlzLkooZCksZj1uZXcgVyhkLHRoaXMuQSksZi5iKCkpfWNhdGNoKGspe319fXRoaXMuSSgpfSxEZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5jYXx8KHRoaXMuY2E9e30pO3RoaXMuY2FbYl18fCh0aGlzLmNhW2JdPXt9KTt0aGlzLmNhW2JdW2FdfHwodGhpcy5jYVtiXVthXT1bXSk7dGhpcy5jYVtiXVthXS5wdXNoKGMpfSxvdjpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLmNhfHx0aGlzLmNhJiYhdGhpcy5jYVthXSl0aGlzLmhjfHwodGhpcy5oYz1bXSksdGhpcy5oYy5wdXNoKGIpLHRoaXMudnUoKSYmKHRoaXMuRmcoKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5jYVthXVtjXSYmMDx0aGlzLmNhW2FdW2NdLmxlbmd0aClmb3IodmFyIGQ9CjA7ZDx0aGlzLmNhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5jYVthXVtjXVtkXShiKX19LFVxOmZ1bmN0aW9uKCl7aWYodGhpcy5oYylmb3IodmFyIGI9MDtiPHRoaXMuaGMubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5oY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD1hLm9FdmVudFR5cGUpO2lmKHRoaXMuY2FbY11bZF0mJjA8dGhpcy5jYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBmPTA7Zjx0aGlzLmNhW2NdW2RdLmxlbmd0aDtmKyspdGhpcy5jYVtjXVtkXVtmXShhKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGIpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT1iLm9FdmVudFR5cGUuaCYmImF1dG9SZXNpemVDYWxsYmFja0FmdGVyIiE9Yi5vRXZlbnRUeXBlLmgmJnkub3YoYil9fSl9KShjKTt2YXIgQmI9Yy5PbHx8QmIseT1uZXcgQmIocSk7YmEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPQpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTHQ9dGhpcy5hWzFdO3RoaXMuYW09dGhpcy5hWzldO3RoaXMuV209dGhpcy5hWzNdO3RoaXMuZnQ9dGhpcy5hWzJdO3RoaXMuZm89dGhpcy5hWzddO3RoaXMuR209dGhpcy5hWzVdO3RoaXMueGw9dGhpcy5hWzNdO3RoaXMuemw9dGhpcy5hWzRdO3RoaXMuYnI9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbNV19Yy5wdj1iO2IucHJvdG90eXBlPXtLdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTHQ6dGhpcy4kbChhKX0sJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVm0oYSl9LFZtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5XbTp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZnQ6dGhpcy5lbyhhKX0sZW86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5mbzp0aGlzLkZtKGEpfSxGbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuR206CnRoaXMud2woYSl9LHdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bDp0aGlzLnlsKGEpfSx5bDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuemw6dGhpcy5hcihhKX0sYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJyOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaTphfX19KShjKTt2YXIgQ2I9Yy5wdnx8Q2IsZWQ9bmV3IENiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuS3QoNCk7KGZ1bmN0aW9uKGMpe2MuV2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVShhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sbGI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBEYj1jLldofHxEYjsoZnVuY3Rpb24oYyl7Yy5YaD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXthLmlzQWQmJmEuaXNBZCgpP3RoaXMubygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5sKCJub0FkIiwicGxheWVkIik7dGhpcy53KCEwKX0uYmluZCh0aGlzKSwyNTApO3RoaXMuYXV8fCh0aGlzLmF1PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmEub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBFYj1jLlhofHwKRWI7KGZ1bmN0aW9uKGMpe2MuWWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBEYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBFYihlLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkkoKX0sSDpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7CnJldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRmI9Yy5ZaHx8RmIsR2I9bmV3IEZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNpPXRoaXMuYVs3XTt0aGlzLkRvPXRoaXMuYVsyXTt0aGlzLnFyPXRoaXMuYVs5XTt0aGlzLkZzPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzZdfWMuTG49YjtiLnByb3RvdHlwZT17Ymk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmNpOnRoaXMuQ28oYSl9LENvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ebzp0aGlzLnByKGEpfSxwcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucXI6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkZzOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaTphfX19KShjKTt2YXIgSGI9Yy5Mbnx8SGIsZmQ9bmV3IEhiKDEsCm5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWZkLmJpKDQpOyhmdW5jdGlvbihjKXtjLnltPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx2YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZmEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEliPWMueW18fEliOyhmdW5jdGlvbihjKXtjLnhtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMua2Z8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLm9xfHwodGhpcy5ZZigpLAp0aGlzLm9xPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm8oKTp0aGlzLmtmPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMucygpKToodGhpcy5rZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxycTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sWWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnJxKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5qYT0hMCx0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLnMoKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ZZigpfS5iaW5kKHRoaXMpLDUwKX0sRng6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sczpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEpiPWMueG18fEpiOyhmdW5jdGlvbihjKXtjLnptPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSWIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBKYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEtiPWMuem18fEtiLExiPW5ldyBLYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Faz10aGlzLmFbOV07dGhpcy5Sdj10aGlzLmFbMTBdO3RoaXMubG09dGhpcy5hWzNdO3RoaXMudXY9dGhpcy5hWzVdO3RoaXMub3Q9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbNl19Yy5Xbz1iO2IucHJvdG90eXBlPXtEazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRWs6dGhpcy5RdihhKX0sUXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Sdjp0aGlzLmttKGEpfSxrbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubG06dGhpcy50dihhKX0sdHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnV2OnRoaXMubnQoYSl9LG50OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5vdDp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmk6YX19fSkoYyk7CnZhciBNYj1jLldvfHxNYixnZD1uZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1nZC5Eayg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5TKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlUoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxmYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpOwpiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTt2YXIgTmI9Yy5aanx8TmI7KGZ1bmN0aW9uKGMpe2MuWWo9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuamgoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLkdmKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLApmdW5jdGlvbigpe3RoaXMuR2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMucW4oKX0uYmluZCh0aGlzKSksdGhpcy5raD0hMSx0aGlzLnd3PTFFMyx0aGlzLnlnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfSxHZjpmdW5jdGlvbigpe3RoaXMueWcuZG9uZXx8KHRoaXMueWcuZG9uZT0hMCx0aGlzLmtoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qaCgpfS5iaW5kKHRoaXMpLHRoaXMud3cpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2gpO3RoaXMubygpfSxqaDpmdW5jdGlvbigpe3RoaXMud2EoKT8odGhpcy5vKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMudygpKX0sTWY6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBmPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTtiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZi5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LHdhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5NZihtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLk1mKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBPYj1jLllqfHxPYjsoZnVuY3Rpb24oYyl7Yy4kaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmCndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8ZS5GYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkZhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuRmEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IE5iKGMpLHRoaXMuSChjKXx8KHRoaXMuSihjKSwobmV3IE9iKGMsdGhpcy5BKSkuYigpKSl9fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBQYj1jLiRqfHxQYixRYj1uZXcgUGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVXc9dGhpcy5hWzEwXTt0aGlzLkhzPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVs4XTt0aGlzLlZ1PXRoaXMuYVsyXTt0aGlzLmk9dGhpcy5hWzRdfWMuJHA9YjtiLnByb3RvdHlwZT17VHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMuR3MoYSl9LEdzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Iczp0aGlzLmNyKGEpfSxjcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZHI6dGhpcy5VdShhKX0sVXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZ1OnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgUmI9Yy4kcHx8UmIsaGQ9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLlR3KDQpOyhmdW5jdGlvbihjKXtjLklsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBTYj1jLklsfHxTYjsoZnVuY3Rpb24oYyl7Yy5IbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLAphKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpO3RoaXMuVmIoKX0sVmI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5jZSgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuY2UoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwKMTApfSxjZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxzOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgVGI9Yy5IbHx8VGI7KGZ1bmN0aW9uKGMpe2MuSmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJgohd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgU2IoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFRiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBVYj1jLkpsfHxVYixWYj1uZXcgVWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzRdO3RoaXMudnc9dGhpcy5hWzEwXTt0aGlzLkNrPXRoaXMuYVs0XTt0aGlzLlFrPXRoaXMuYVs2XTt0aGlzLlZoPXRoaXMuYVsyXTt0aGlzLk1qPXRoaXMuYVsxXTt0aGlzLlhuPXRoaXMuYVsyXTt0aGlzLmpzPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzVdfWMuZmo9YjtiLnByb3RvdHlwZT17VW86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZvOnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuQ246dGhpcy51dyhhKX0sdXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZ3OnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dazp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUWs6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlZoOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5XbihhKX0sV246ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhuOnRoaXMuaHMoYSl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmk6YX19fSkoYyk7dmFyIFdiPWMuZmp8fFdiLGlkPW5ldyBXYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PQppZC5Vbyg0KTsoZnVuY3Rpb24oYyl7Yy5CbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuUyhiKTt0aGlzLlUoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy50ZT0hMX0sZmE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZHUoKX0uYmluZCh0aGlzKSw1MDApfSxkdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7CnJldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy50ZSYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy50ZSk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFh1OmZ1bmN0aW9uKCl7dGhpcy50ZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksCjEwKX0sTDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBYYj1jLkJsfHxYYjsoZnVuY3Rpb24oYyl7Yy5BbD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpO3RoaXMuTmI9MH0sYjpmdW5jdGlvbigpe3RoaXMuSnM9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk5ifHwodGhpcy5OYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLnMoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsCiJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5zKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnMoKSkpOih0aGlzLk5ifHx0aGlzLk5iKyssdGhpcy5OYjw9dGhpcy5Kcz8odGhpcy5OYisrLAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMucygpKSl9LHM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlh1KCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBZYj1jLkFsfHxZYjsoZnVuY3Rpb24oYyl7Yy5DbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBYYih3aW5kb3cucGxheWVyQXBpKSwKdGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgWWIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBaYj1jLkNsfHxaYiwkYj1uZXcgWmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUWk9dGhpcy5hWzNdO3RoaXMuQmg9dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVsxXTt0aGlzLlJ1PXRoaXMuYVs5XTt0aGlzLlBuPXRoaXMuYVszXTt0aGlzLnVyPXRoaXMuYVs0XTt0aGlzLlpsPXRoaXMuYVsxXTt0aGlzLklwPXRoaXMuYVsyXTt0aGlzLiRpPXRoaXMuYVsxMF07dGhpcy5pPXRoaXMuYVs0XX1jLm9tPWI7Yi5wcm90b3R5cGU9e1BpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RaTp0aGlzLkFoKGEpfSxBaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQmg6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRoOnRoaXMuUXUoYSl9LApRdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUnU6dGhpcy5PbihhKX0sT246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlBuOnRoaXMudHIoYSl9LHRyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51cjp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWmw6dGhpcy5IcChhKX0sSHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLklwOnRoaXMuWmkoYSl9LFppOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy4kaTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIGFjPWMub218fGFjLGpkPW5ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWpkLlBpKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlMoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTtyZXR1cm4gYX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLmR1cmF0aW9uJiYoYT1iLmR1cmF0aW9uKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEN1cnJlbnRUaW1lKCksYT0KdGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBiYz1jLnNsfHxiYzsoZnVuY3Rpb24oYyl7Yy5ybD11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZzthJiZhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLnBiKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuZXAoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuVmMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLm1zKCk6dGhpcy5WYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZigpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMucyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LGVwOmZ1bmN0aW9uKCl7dGhpcy5kZigpfHx0aGlzLnMoITApfSxtczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmMoKTshYi5tYSYmYi5XJiZiLmt4JiZiLm14JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMucygpKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlZjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PQp0eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMubygpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsYiksdGhpcy5zKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmIoKX0uYmluZCh0aGlzKSwxMDApfSxWYzpmdW5jdGlvbigpe2lmKCF0aGlzLnVnKWZvcih2YXIgYj1sLnBsYXllcmFwaSgpLGE9dGhpcy5nZXRQbGF5ZXIoKS5FYSgpLmlkLGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLmlkPT1hJiYodGhpcy51Zz1iW2NdKTtyZXR1cm4gdGhpcy51Z30sY2U6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sczpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuVmMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKToKdGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNjPWMucmx8fGNjOyhmdW5jdGlvbihjKXtjLnRsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKGwmJmwucGxheWVyYXBpKXt2YXIgYj1sLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGJjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBjYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBkYz1jLnRsfHxkYyxlYz1uZXcgZGMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLmNtPXRoaXMuYVsxMF07dGhpcy51bz10aGlzLmFbOV07dGhpcy5CdD10aGlzLmFbN107dGhpcy5jbz10aGlzLmFbNV07dGhpcy5Haj10aGlzLmFbMTBdO3RoaXMucmg9dGhpcy5hWzVdO3RoaXMuY3M9dGhpcy5hWzFdO3RoaXMuaXE9dGhpcy5hWzhdO3RoaXMuaT10aGlzLmFbMl19Yy5Fcj1iO2IucHJvdG90eXBlPXtibTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY206dGhpcy50byhhKX0sdG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVvOnRoaXMuQXQoYSl9LEF0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CdDp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnFoKGEpfSxxaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMucmg6dGhpcy5icyhhKX0sYnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNzOnRoaXMuaHEoYSl9LApocTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuaXE6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBmYz1jLkVyfHxmYyxrZD1uZXcgZmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5ibSg0KTsoZnVuY3Rpb24oYyl7Yy5xaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RiYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlMoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hPwp0aGlzLlUoYSk6dGhpcy5lYSgpfWVsc2UgdGhpcy5lYSgpfSxwYXVzZTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEYpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LEdiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEVhOmZ1bmN0aW9uKCl7dmFyIGI7Rj8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7CmIhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5xa3x8WDsoZnVuY3Rpb24oYyl7Yy5waz11LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaihiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy52ZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLnZlPWIuaWQpO0Y/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMudmUmJmIhPXRoaXMudmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihsLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5KeCksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLnBrfHxZOyhmdW5jdGlvbihjKXtjLnJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Y9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihGKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFkoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIua2E/dGhpcy5GZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBZKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRixnYz1jLnJrfHxnYyxoYz1uZXcgZ2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5xYi5sZW5ndGgpe3ZhciBhPW0ucWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuS3UoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUua2cuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlsW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLmtnKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVHA9dGhpcy5hWzZdO3RoaXMuT209dGhpcy5hWzldO3RoaXMuVGs9dGhpcy5hWzZdO3RoaXMuaT10aGlzLmFbOF19Yy5haj1iO2IucHJvdG90eXBlPXtTcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVHA6dGhpcy5ObShhKX0sTm06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5PbTp0aGlzLlNrKGEpfSxTazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVGs6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBpYz1jLmFqfHxpYyxsZD1uZXcgaWMoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bGQuU3AoNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlMoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5VKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5Tcz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX1lbHNlIHRoaXMuZWEoKX0sCkN1OmZ1bmN0aW9uKGIpe3RoaXMuQmQ9Yn0sdmE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Tc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxmYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5zYihiKX0uYmluZCh0aGlzKSl9LHNiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CnRoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLkJkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5CZCYmKG5ldyBJKHRoaXMsdGhpcy5CZCkpLmIoKSl9fSl9KShjKTt2YXIgTj1jLmdtfHxOOyhmdW5jdGlvbihjKXtjLmZtPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LFhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5SZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/CnRoaXMuTXUoKTp0aGlzLnMoITApLCEwO3RoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMucygpOnRoaXMucyghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLlJkPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEpO3RoaXMud2EoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5WKSx0aGlzLnMoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhhKCl9LmJpbmQodGhpcyksMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSwKWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5WPWEsYi5sKCJhZGVycm9yIixhKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt0aGlzLlY9dGhpcy5WfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuWGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHM6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJPWMuZm18fEk7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpO3RoaXMueGE9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmCndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IEkoYix0aGlzLkEpLGIuYigpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5rYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGIuQ3UodGhpcy5BKSxiPW5ldyBJKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIGpjPWMuaG18fGpjLGtjPW5ldyBqYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy51dD0KdGhpcy5hWzVdO3RoaXMuYXQ9dGhpcy5hWzVdO3RoaXMuenM9dGhpcy5hWzldO3RoaXMuaT10aGlzLmFbOV19Yy5Saz1iO2IucHJvdG90eXBlPXt0dDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXQ6dGhpcy4kcyhhKX0sJHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmF0OnRoaXMueXMoYSl9LHlzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy56czp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBsYz1jLlJrfHxsYyxtZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC50dCg0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy51Zj0KMDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuUyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVShhKTp0aGlzLmVhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51Zn0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGZhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLks/KDAsdGhpcy5LKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3pvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMudWY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEsCnt6bzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sTDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIG1jPWMubmt8fG1jOyhmdW5jdGlvbihjKXtjLm1rPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LE54OmZ1bmN0aW9uKCl7fSxxdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLlRlKG5ldyBmdW5jdGlvbigpe30pO2EuaHg9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IucXUoYSk7d2luZG93LnB4PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLnB1fHwodGhpcy5wdT0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLllkfHwodGhpcy5ZZD0xKTtpZigyMDx0aGlzLllkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnMoITApO2Vsc2V7dmFyIGE9CiExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkthKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuWWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEthOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKTt0aGlzLlkoKX0uYmluZCh0aGlzKSk7CmIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5BZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlgoYSwhMCk7dGhpcy5ZKCEwKX0uYmluZCh0aGlzKSl9LFg6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTsKYj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuWChhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMuWSghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxxYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LFk6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/Cih0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBuYz1jLm1rfHxuYzsoZnVuY3Rpb24oYyl7Yy5vaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbWMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmthfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBuYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgb2M9Yy5va3x8b2MscGM9bmV3IG9jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Sbj10aGlzLmFbMV07dGhpcy5Odz10aGlzLmFbN107dGhpcy5Jaz10aGlzLmFbNV07dGhpcy5PcT10aGlzLmFbMV07dGhpcy5Zbz10aGlzLmFbNV07dGhpcy5hcz10aGlzLmFbM107dGhpcy53az10aGlzLmFbNl07dGhpcy5qbD10aGlzLmFbM107dGhpcy5Vdj10aGlzLmFbOF07dGhpcy5pPXRoaXMuYVsxMF19Yy5OcD1iO2IucHJvdG90eXBlPXtRbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJuOnRoaXMuTXcoYSl9LE13OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTnc6dGhpcy5IayhhKX0sSGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLklrOnRoaXMuTnEoYSl9LE5xOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5PcTp0aGlzLlhvKGEpfSxYbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW86dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFzOgp0aGlzLnZrKGEpfSx2azpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndrOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qbDp0aGlzLlR2KGEpfSxUdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVXY6dGhpcy5nKGEpfSxnOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5pOmF9fX0pKGMpO3ZhciBxYz1jLk5wfHxxYyxuZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Rbig0KTsoZnVuY3Rpb24oYyl7Yy5kaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmooYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlMoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVShhKTthJiZ0aGlzLlMoYS5wYXJlbnROb2RlKX0sTDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLmRrfHxaOyhmdW5jdGlvbihjKXtjLmNrPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlVmPTA7dGhpcy5WPXRoaXMuVnx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmphPXRoaXMuZWM9dGhpcy5YYT10aGlzLkJjPSExO3RoaXMuQ2c9ZS5uYigxMCk7dGhpcy5jZygpfSxjZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT0KYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkthKCksITA7dGhpcy5VZisrO2lmKDEwPHRoaXMuVWYpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMucyghMCk6dGhpcy5zKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5jZy5iaW5kKHRoaXMpLDEwMCksITF9LEthOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiYKZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWChhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5YKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5WKTt0aGlzLlkoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmlhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5LYSgpfS5iaW5kKHRoaXMpLDIwKX0sWDpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PQphLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlY9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7CmJyZWFrfX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxZOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm8oKSx0aGlzLm5hKCkpOnRoaXMucyhiKX0uYmluZCh0aGlzKSwxMDApfSxzOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnMoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGFhPWMuY2t8fGFhOyhmdW5jdGlvbihjKXtjLmVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sYjpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0KMDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IGFhKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIHJjPWMuZWt8fHJjLHNjPW5ldyByYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbMl07dGhpcy50aj10aGlzLmFbNl07dGhpcy5Qdz10aGlzLmFbN107dGhpcy5GaD10aGlzLmFbMTBdO3RoaXMuSWg9dGhpcy5hWzRdO3RoaXMuc3I9dGhpcy5hWzldO3RoaXMud2k9CnRoaXMuYVsxMF07dGhpcy5TbT10aGlzLmFbOV07dGhpcy5tdD10aGlzLmFbM107dGhpcy5Scz10aGlzLmFbMTBdO3RoaXMuaT10aGlzLmFbMl19Yy52dD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXI6dGhpcy5zaihhKX0sc2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRqOnRoaXMuT3coYSl9LE93OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qdzp0aGlzLkVoKGEpfSxFaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZoOnRoaXMuSGgoYSl9LEhoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5JaDp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy52aShhKX0sdmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLndpOnRoaXMuUm0oYSl9LFJtOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TbTp0aGlzLmx0KGEpfSxsdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubXQ6CnRoaXMuUXMoYSl9LFFzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Sczp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIHRjPWMudnR8fHRjLG9kPW5ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLmxyKDQpOyhmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaihiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLlMoYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/dGhpcy5VKGIpOnRoaXMuZWEoKSk6dGhpcy5lYSgpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwp0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSwkYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLmR1cmF0aW9uP2IudmlkZW9pbmZvLmR1cmF0aW9uOjB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdWM9Yy5UaXx8dWM7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmooYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVBsYXlpbmciLApmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5zKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgdmM9Yy5TaXx8dmM7KGZ1bmN0aW9uKGMpe2MuVWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRmEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB1YyhkKSxkLmthfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB2YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkkoKX19KX0pKGMpO3ZhciB3Yz1jLlVpfHx3Yyx4Yz1uZXcgd2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuam09dGhpcy5hWzNdO3RoaXMuTm49CnRoaXMuYVs3XTt0aGlzLnl0PXRoaXMuYVszXTt0aGlzLktpPXRoaXMuYVs4XTt0aGlzLnpoPXRoaXMuYVs3XTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLmhrPXRoaXMuYVs5XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmFvPXRoaXMuYVs5XTt0aGlzLmk9dGhpcy5hWzVdfWMucm89YjtiLnByb3RvdHlwZT17aW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmptOnRoaXMuTW4oYSl9LE1uOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Objp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueXQ6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLktpOnRoaXMueWgoYSl9LHloOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aDp0aGlzLkhyKGEpfSxIcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSXI6dGhpcy5nayhhKX0sZ2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmhrOnRoaXMubWkoYSl9LG1pOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMubmk6dGhpcy4kbihhKX0sJG46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmFvOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuaTphfX19KShjKTt2YXIgeWM9Yy5yb3x8eWMscGQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuaW0oNCk7KGZ1bmN0aW9uKGMpe2MuWGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLlMoYiksdGhpcy5VKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZWEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsCiJub25lIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsImJsb2NrIil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHpjPWMuWGl8fHpjOyhmdW5jdGlvbihjKXtjLldpPXUuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5qKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLm9mKCl9LG9mOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZighMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgQWM9Yy5XaXx8QWM7KGZ1bmN0aW9uKGMpe2MuWWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5qKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiYKd2luZG93LiQmJndpbmRvdy4kKCJkaXYjZ2FtZSIpKXtiPW5ldyB6Yyh3aW5kb3cuJCgiZGl2I2dhbWUiKSk7aWYoYi5rYSl7dGhpcy5JKCk7cmV0dXJufWlmKCF0aGlzLkgoYikpe3RoaXMuSihiKTsobmV3IEFjKGIsdGhpcy5BKSkuYigpO3RoaXMuSSgpO3JldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgQmM9Yy5ZaXx8QmMsQ2M9bmV3IEJjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkduPXRoaXMuYVs5XTt0aGlzLmx1PXRoaXMuYVs0XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLklpPXRoaXMuYVsxMF07dGhpcy52aj10aGlzLmFbOF07dGhpcy5rcj10aGlzLmFbMV07dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Saj10aGlzLmFbOF07dGhpcy5NaT10aGlzLmFbOV07dGhpcy5pPXRoaXMuYVs2XX1jLnlwPWI7Yi5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3JldHVybiA4PAphP3RoaXMuR246dGhpcy5rdShhKX0sa3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmx1OnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vcjp0aGlzLkhpKGEpfSxIaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSWk6dGhpcy51aihhKX0sdWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52ajp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3I6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNyOnRoaXMuUWooYSl9LFFqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Sajp0aGlzLkxpKGEpfSxMaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1pOnRoaXMuZyhhKX0sZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaTphfX19KShjKTt2YXIgRGM9Yy55cHx8RGMscWQ9bmV3IERjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXFkLkZuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmVnPXRoaXMuaGc9dGhpcy5nZz0hMTt0aGlzLmVkPVtdO3RoaXMueWU9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIENjP251bGw6Q2MsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHNjP251bGw6c2MsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBLYT9udWxsOkthLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFVhP251bGw6VWEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBaYT9udWxsOlphLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBlYz9udWxsOgplYyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBrYz9udWxsOmtjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgaGM/bnVsbDpoYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgR2I/bnVsbDpHYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBwYz9udWxsOnBjLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB6Yj9udWxsOnpiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB4Yz9udWxsOnhjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgZGI/bnVsbDpkYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaWI/bnVsbDppYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgQWE/bnVsbDpBYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBQYT9udWxsOlBhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFhP251bGw6cWF9fWMub2w9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5GcShhKTpbXSxiO3RoaXMuaGc9ITA7aWYoYS5sZW5ndGgpe3RoaXMuZ2c9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuR2coYil9ZWxzZSBmb3IoYyBpbiB0aGlzLnllKXtpZih0aGlzLmVnKWJyZWFrO2I9dGhpcy55ZVtjXTt0aGlzLk9lKGIpJiYodGhpcy5lZC5wdXNoKGIpLHRoaXMuR2coYikpfX0sT2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxGcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjOwppZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMueWVbY10sdGhpcy5PZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxHZzpmdW5jdGlvbihhKXt0aGlzLk9lKGEpJiZhLmIoKX0sWnU6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLmdnKWZvcih0aGlzLmVnPSEwLGE9MDthPHRoaXMuZWQubGVuZ3RoO2ErKyl0aGlzLmVkW2FdLnRiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZWRbYV0udGIpfX19KShjKTt2YXIgRWM9Yy5vbHx8RWMsTD1uZXcgRWM7TC5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ2k9dGhpcy5hWzFdO3RoaXMuUnQ9dGhpcy5hWzRdO3RoaXMuZ3I9dGhpcy5hWzVdO3RoaXMuTnQ9dGhpcy5hWzldO3RoaXMuYWk9dGhpcy5hWzNdO3RoaXMuYms9dGhpcy5hWzEwXTsKdGhpcy5CdT10aGlzLmFbNF07dGhpcy55cj10aGlzLmFbOV07dGhpcy5PaD10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVs5XX1jLmJuPWI7Yi5wcm90b3R5cGU9e2ZpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5naTp0aGlzLlF0KGEpfSxRdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUnQ6dGhpcy5mcihhKX0sZnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdyOnRoaXMuTXQoYSl9LE10OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5OdDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWk6dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmJrOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5CdTp0aGlzLnhyKGEpfSx4cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueXI6dGhpcy5OaChhKX0sTmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9oOnRoaXMuZyhhKX0sCmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmk6YX19fSkoYyk7dmFyIEZjPWMuYm58fEZjLHJkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLmZpKDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9Yi5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWIuc3Vic3RyaW5nKGIuaW5kZXhPZigiOiIpKzEsYi5pbmRleE9mKCJpcyBub3QiKS0xKSxlLlpiKGsuWXYpLGUudHJhY2soInN0YXRzX2hkX3ZhcmRlbGV0ZWQiLApjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5aYihrLlZzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Ry53aWR0aD0xO0cuaGVpZ2h0PTE7Ry5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEcpO3ZhciBzZD1HLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLGZhPUcuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEcpO3ZhciBIPW5ldyBSLGw9ITE7SC5mYygpO0guWmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILmZjKCksZnVuY3Rpb24oYyl7bHx8KGw9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSC5aZigpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtlLmZpcmVFdmVudCh3aW5kb3csCkguSnIoKSx7aWQ6dGR9KX0sNTAwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmZ4PXRoaXMuYVsyXTt0aGlzLkV3PXRoaXMuYVsxXTt0aGlzLm9zPXRoaXMuYVs5XTt0aGlzLk9pPXRoaXMuYVs1XTt0aGlzLlhwPXRoaXMuYVs5XTt0aGlzLlpuPXRoaXMuYVs1XTt0aGlzLmk9dGhpcy5hWzEwXX1jLlN3PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5meDp0aGlzLkR3KGEpfSxEdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRXc6dGhpcy5ucyhhKX0sbnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm9zOnRoaXMuTmkoYSl9LE5pOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5PaTp0aGlzLldwKGEpfSxXcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWHA6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5abjp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmk6YX19fSkoYyk7dmFyIEdjPWMuU3d8fEdjLHVkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLmV4KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5BZz10aGlzLmNvbmY9dGhpcy5XYT10aGlzLnBsYXllcj1udWxsO3RoaXMuYWQ9MDt0aGlzLk5hPSIiO3RoaXMuZmQ9W107dGhpcy5nZD0wO3RoaXMuQmc9ITE7dGhpcy53ZT1bXX1jLm9oPWI7Yi5wcm90b3R5cGU9e0p1OmZ1bmN0aW9uKGEpe3RoaXMuQWc9YX0samQ6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLk5hPXRoaXMucGxheWVyLkwoKX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxFdTpmdW5jdGlvbihhKXt0aGlzLldhPWF9LER1OmZ1bmN0aW9uKGEpe3RoaXMuY29uZj0KYX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxrYzpmdW5jdGlvbihhLGIpe2UuamIoIndlbHQuZGUiKSYmZS5NYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLCJuZXRudWdnYWRhc3YiLHt9LGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcy5XYSk7dmFyIGM9ITEsZj0hMTtpZih0aGlzLk5yKCkpdGhpcy5XYS5jKHRoaXMuV2EuWGMsdGhpcy5XYS5CYSx0aGlzLldhLnhlLGZ1bmN0aW9uKCl7dGhpcy5rYyhhLApiKX0uYmluZCh0aGlzKSx0aGlzLldhLk5jKTtlbHNlIGlmKHRoaXMuV3EoKSl0aGlzLnp1KGZ1bmN0aW9uKCl7dGhpcy5rYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS5EKGsuS2MsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsbD1uZXcgTyh0aGlzLmdldFBsYXllcigpLGgpO2ImJmwuJHUoKTtsLmV4aXRGdWxsc2NyZWVuKCk7Uz1sPW5ldyBQKGwsdGhpcy5XYSxoKTtsLkpnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLklzKGEpOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5lZSYmKGM9dGhpcy5wbGF5ZXIuZWUoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGY9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZ2UoYSwKYyxmKTt0aGlzLnBsYXllci5LZyhsKX19LE5yOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuYWQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5hZC5nZXRUaW1lKCksdGhpcy5hZD1hLDNFNTxiPyEwOiExO3RoaXMuYWQ9YTtyZXR1cm4hMX0sVHU6ZnVuY3Rpb24oKXtlLkNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQ2YoYSkpP3RoaXMua2MoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5EKGsuTGMsdGhpcy5wbGF5ZXIuQigpKSl9LFN1OmZ1bmN0aW9uKGEpe2UuQ2UoInBvc3Ryb2xsIik7aWYoIXRoaXMuQWcpe3RoaXMuSnUoITApO3ZhciBiPXRoaXMuY29uZixjPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpJiYoYz10aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikpOwooYz10aGlzLkNmKGMpKT90aGlzLmtjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQoay5MYyx0aGlzLnBsYXllci5CKCkpKX19LENmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxzdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLk91KHRoaXMuU3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZmEoKX0sbWQ6ZnVuY3Rpb24oYSl7ZS5DZSgibWlkcm9sbCIpO2lmKCF0aGlzLm1nKXt0aGlzLm1nPSEwO3ZhciBiPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgibWlkcm9sbEFkVGFnIikmJihiPXRoaXMudGEoIm1pZHJvbGxBZFRhZyIpKTtiPyh0aGlzLmtjKGIsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nPSExfS5iaW5kKHRoaXMpLDFFMykpOgoodGhpcy5wbGF5ZXIucGxheSgpLGUuRChrLkxjLHRoaXMucGxheWVyLkIoKSkpfX0scnU6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5JdSh0aGlzLm1kLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmtlKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlR1KCk7dGhpcy5wbGF5ZXIua2UmJnRoaXMucnUoKTt0aGlzLnN1KCl9LHR1OmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuZmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLlZ3KGEsYixjLGcsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy5nZD10aGlzLmZkLmxlbmd0aH0sV3E6ZnVuY3Rpb24oKXt2YXIgYT0KITE7MDx0aGlzLmdkJiYoYT0hMCk7cmV0dXJuIGF9LHp1OmZ1bmN0aW9uKGEpe3RoaXMuQmc9YTtmb3IoYT0wO2E8dGhpcy5mZC5sZW5ndGg7YSsrKXRoaXMuZmRbYV1bImZ1bmN0aW9uIl0odGhpcy5ndS5iaW5kKHRoaXMpKX0sZ3U6ZnVuY3Rpb24oYSl7dGhpcy5nZC0tO2EmJnRoaXMud2UucHVzaChhKTswPj10aGlzLmdkJiZ0aGlzLkJnKCl9LElzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLndlLmxlbmd0aDtjKyspYj10aGlzLndlW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBoYT1jLm9ofHxoYSxTPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk52PXRoaXMuYVsxMF07dGhpcy5saT10aGlzLmFbNF07dGhpcy5pPXRoaXMuYVszXX1jLmZrPWI7Yi5wcm90b3R5cGU9e012OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLk52OnRoaXMua2koYSl9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5saTp0aGlzLmcoYSl9LGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmk6YX19fSkoYyk7dmFyIEhjPWMuZmt8fEhjLHZkPW5ldyBIYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLk12KDQpfSkuY2FsbChhaXRoYWlOZ0llYmVpbG9vLGFpdGhhaU5nSWViZWlsb28pOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.65.40 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.40.65.243.136.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
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
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
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
Tue, 27 Nov 2018 15:48:14 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
activeview
pagead2.googlesyndication.com/pcs/ Frame DE6A
42 B
116 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstD8UsVJbUCs85C8_0PcOuuUvY1DGxa9GiNZh1rIoyQftgZAnYpd9v1HgLCGQzoXAo68N8Cd7wxr3sSaXAwVOBpXQx7VgXxxAyCKNE&sig=Cg0ArKJSzCfMlOU6Ug97EAE&adk=1289509276&tt=-1&bs=1585%2C1200&mtos=1004,1004,1004,1004,1004&tos=1004,0,0,0,0&p=888,993,1138,1293&mcvt=1004&rs=3&ht=0&tfs=647&tls=1651&mc=1&lte=1&bas=0&bac=0&avms=geo&rst=1543333693489&rpt=1&isd=0&msd=0&ps=1585%2C11900&ss=1600%2C1200&pt=-1&deb=1-1-9-23-14-18-83-4&tvt=1638&r=v&id=osdim&uc=5&tgt=IFRAME&cl=1&cec=8&clc=1&cac=0&cd=300x250&v=r20181107
Protocol
SPDY
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
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
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

pragma
no-cache
date
Tue, 27 Nov 2018 15:48:14 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
42
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
tt.onthe.io/
0
287 B
XHR
General
Full URL
https://tt.onthe.io/?k[]=43098:time[url:%2F,site_skin:desktop,device:desktop,custom_page_type:Home%20page,cdn_version:4]&s=6acc7c777cce3be138a245218c439c54&1543333702786
Requested by
Host: cdn.onthe.io
URL: https://cdn.onthe.io/io.js/IjvnOpbzskTW
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
188.40.114.52 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.52.114.40.188.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
Tue, 27 Nov 2018 15:48:22 GMT
Server
nginx
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:01 GMT

Verdicts & Comments Add Verdict or Comment

246 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| Golem object| _gcpx string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW string| n_pbt boolean| gzipEnabled object| _gafccsi string| iqd_mode object| IQD object| AdController undefined| _ object| AdControllerContainer string| _ADC_VERSION object| regexMatcher object| googletag boolean| isConsent function| setConsentBehaviour function| setMoatPrebidData string| iqPerfDB boolean| iqPerf function| IQCreateMark function| IQGetEntryByName function| IQGetStartTimeForEntry function| IQGetDurTimeForEntry number| amzkwready number| crkwready number| apnxkwready number| ylbkwready function| IQRunMeasurement string| iqYlSite boolean| iqYlNew object| adaYlFormatId object| iqYlCs function| IQSroundBids object| iqYlObj string| src_yieldlab function| IQSLoader object| pbjs string| amzAllocations object| apstag function| iqDefineHeaderBids boolean| deliveringAds string| adblocktest string| iqcpurl string| src_xplosion string| src_contentplatform string| src_yield string| gs_channels object| gsurl string| src_grapeshot string| level2 string| handle object| inViewConfInfos object| toRenderAds object| isRenderAds string| adTile function| createIQLabel function| setIQCreativeSpace function| removeIQLabelAndSpace object| IQD_varPack function| setIQTile string| iqVisClass string| iqdCI string| iqdCIs undefined| iqLoggerSrc object| IQDAO object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| yl object| extData function| _h object| _adexc object| adex function| pbjsChunk object| __core-js_shared__ object| Criteo undefined| ct undefined| et undefined| hourElapsed undefined| msg undefined| pixelDomain undefined| pxSrc undefined| px object| Moat#G26 object| MoatSuperV26 object| MoatNadoAllJsonpRequest_88919268 boolean| Moat#EVA object| moatPrebidApi object| _satellite boolean| __satelliteLoaded function| Visitor object| s_c_il number| s_c_in object| _ADB function| getReferrerType function| _adbStorageSet function| _adbStorageGet function| _adbCheckScrollOffset function| appendToList function| _adbHandleError string| delayedData object| _EQLService object| _EQPScript object| GPT_jstiming object| google_reactive_ads_global_state boolean| google_measure_js_timing boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id string| arg object| iqd_gpt_slots number| google_unique_id object| gaGlobal function| s_doPlugins function| adbAddMediaEvtHandler function| AppMeasurement_Module_AudienceManagement function| AppMeasurement_Module_Media function| onYouTubePlayerReady function| s_YTp function| s_YTisa function| s_YTism function| s_YTgk function| onYouTubePlayerAPIReady function| s_YTdi function| s_YTei function| s_YTut function| s_YTdv function| s_YTv function| AppMeasurement_Module_ActivityMap function| AppMeasurement function| s_gi function| s_pgicq string| s_account object| s undefined| _videos object| s_YTO function| DIL number| s_objectID number| s_giq function| $ function| jQuery object| iAbo function| golemAcceptCookies object| IQDComplete function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter object| __google_ad_urls object| t4ftPlacement boolean| google_osd_loaded boolean| google_onload_fired boolean| subDomainCheckVar function| UABPdd object| uabp684Flags string| uabp053Rnd object| uabpd15ctc string| szmvars object| iom object| iam_data object| _io_config string| disableStr object| _gaq string| _adbIQCreatives object| s_i_iqdmmgglobalprod boolean| uabp2d8sdl boolean| uabp2d8sdln string| uabpd15cgenat string| uabpd15csthash boolean| uabp098forceimp boolean| uabp23bnewinject object| _EQPService object| _emqYL string| ada_publisher object| _adrtx object| _emqAdexGif object| _emqConImpact object| adsbygoogle object| _gat object| _AAMImg boolean| uabpf9eBody boolean| uabp459Detect object| uabpd15c1 object| uabpd15co1 object| uabpd15co2 object| uabpd15co3 object| uabpd15c2 number| uabpd15cd3 object| uabpd15c4 object| uabpd15c5 boolean| uabpfc5ij object| _emtriqIDImg object| iqMoatIdCollector object| __io object| google_ad_modifications object| google_sa_queue object| google_sl_win function| google_process_slots function| google_spfd object| google_sv_map object| google_t12n_vars function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| Swiper object| IQCreatives object| rmp3pi function| SwfVideo object| exportz object| f string| _io_uniques_holing_params object| uabp781Mobile function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| google_pub_config number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy object| criteo_pubtag object| core object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock boolean| uabpb82Track object| aithaiNgIebeiloo string| v object| sx object| tx function| videopkgInterface 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_493497 object| closure_lm_11998 string| hic_qos

5 Cookies

Domain/Path Name / Value
golem.whitepaperdb.de/ Name: _pk_ses.3.c779
Value: *
golem.whitepaperdb.de/ Name: _pk_id.3.c779
Value: 556172771ba42b7b.1543333694.1.1543333694.1543333694.
.doubleclick.net/ Name: IDE
Value: AHWqTUnEGlgbfv0XxZhviXKuwMs3nS3n1qfHz-Le78H3fnIAfvoqowqvT9BijKGQ
golem.whitepaperdb.de/ Name: _pk_ref.3.c779
Value: %5B%22%22%2C%22%22%2C1543333694%2C%22https%3A%2F%2Fwww.golem.de%2F%22%5D
golem.whitepaperdb.de/ Name: WIDS
Value: 3761

14 Console Messages

Source Level URL
Text
console-api log (Line 20)
Message:
gdpr - query_string
console-api log (Line 2)
Message:
gdpr_yieldlab.js
console-api log (Line 2)
Message:
gdpr_header-bidding.js
console-api log (Line 255)
Message:
localjs_ready
console-api log (Line 1)
Message:
gdpr_global.js
console-api log (Line 34)
Message:
gdpr_examine_consent.js
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4775329615, Creative-ID-138242228674, tile = 1
console-api log (Line 131)
Message:
IQDAIF ready
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4686089258, Creative-ID-138235188578, tile = 3
console-api log (Line 322)
Message:
Standard Banner :: (3rdPARTY Tag) :: LineItem-ID-4643513462, Creative-ID-138234532157, tile = 9
console-api log (Line 322)
Message:
Standard Banner :: (3rdPARTY Tag) :: LineItem-ID-4643517062, Creative-ID-138234541632, tile = 16
console-api log (Line 99)
Message:
3rd-Party Redirect :: LineItem-ID-4550223008, Creative-ID-85376452645, tile = 8
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4686089258, Creative-ID-138235188476, tile = 4

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.

aax.amazon-adsystem.com
ad.yieldlab.net
ads.golem.de
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
assets.adobedtm.com
bidder.criteo.com
c.amazon-adsystem.com
cdn.adrtx.net
cdn.emetriq.de
cdn.onthe.io
cdn.radiantmediatechs.com
cm.everesttech.net
cpx.golem.de
cpxl.golem.de
d.df-srv.de
d1pywvbolq0b04.cloudfront.net
de.ioam.de
dmp.theadex.com
dpm.demdex.net
dsp.adfarm1.adition.com
dx6ctphzljkf1.cloudfront.net
dyn.emetriq.de
golem.de
golem.whitepaperdb.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
imasdk.googleapis.com
iqdigital.demdex.net
iqdigitalmediamarketinggmbh.sc.omtrdc.net
iqdtms.golem.de
mb.moatads.com
p.yieldlab.net
pagead2.googlesyndication.com
px.moatads.com
s0.2mdn.net
s3.amazonaws.com
script.ioam.de
securepubads.g.doubleclick.net
ssl.1.damoh.golem.de
ssl.google-analytics.com
static.criteo.net
stats.g.doubleclick.net
tpc.googlesyndication.com
tt.onthe.io
ups.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagservices.com
xpl.theadex.com
z.moatads.com
136.243.65.40
143.204.212.210
143.204.214.67
165.227.149.77
172.217.23.162
172.82.228.19
178.250.0.130
178.250.0.93
185.33.223.202
188.40.114.52
2.18.232.233
2001:16e0:10a:1::c1:1
2001:16e0:10a:1::c2:1
23.211.10.211
23.211.8.45
2600:9000:2047:8800:1c:9fd1:6d00:21
2600:9000:2047:9a00:1:9777:c740:21
2600:9000:2047:ee00:1c:8c89:a300:93a1
2606:4700:30::6818:6624
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:13c8:f5::f:4b3d:182
2a00:1450:4001:806::2002
2a00:1450:4001:815::2002
2a00:1450:4001:81d::2002
2a00:1450:4001:81d::2008
2a00:1450:4001:81f::2001
2a00:1450:4001:81f::2006
2a00:1450:4001:81f::200a
2a00:1450:4001:81f::200e
2a00:1450:4001:821::2002
2a00:1450:4001:825::2002
2a00:1450:400c:c0c::9a
35.177.180.124
52.17.26.15
52.212.57.107
52.213.21.157
52.215.3.29
52.216.164.213
52.49.41.66
52.94.216.48
54.194.108.5
62.138.242.228
66.117.28.86
77.247.84.128
77.247.84.129
85.114.144.107
85.114.144.194
85.114.159.93
89.163.159.112
89.163.159.116
91.215.103.64
91.215.103.65
0082fe14c386acfd06aded26e1e144327a92044da86c5d174efeda1436b31579
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f
03f7576a535f8dc268a06336eff96c54762adb8c86be763c53cd2958146af91d
041baba733dd9e00f155f0bd1f3fd44ccc1c2afcb5d195c080b75247e66e373f
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
04b516116faefd9ae9b6140f709053bfa9bf88e22b8d0b024974cae651ac4be8
055ca20f7f779ee7a7a2d7f9fa994130b1120da7ed4c76506033d5b03b3b3f02
08b757c7ef1eaebe9fb2331abd30ecc0a470c2166994c1cfa941c126a698679c
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
106c5562d37543e0d9505b8b75c787eaeaa2ee08a99f9f385568f565b0444afb
11df9c12d7e119a6de1ef2f928a41131933d31fa59d062ba63a0f4f72b81e944
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
154bccd7107284e456a3f911a5b500b703b5ee8caa4983c269d90fc565054f58
166f9390df29e23f9c9c45c50026de3b8ea04605424c6edc8557a3d3e71af7b8
167cbc70ebee688bd24e916da66aa3c570af8a30b151d8c7dd607b8ff24d97b2
16bf55699b231e61b03034b7b6d223670bbd1d39c1dcf393d4e0b683798d302a
1d89573c5259012cba5eed5e7d9ee5c1daf0738d027c19769e88393d97257fd5
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
21df4ace5aa7646581a4705e06d03c93d023f5d265d03f14d12ee471d2861d6e
2bb9ffe339a88aed52c775b145bb7200de2f2373a0f524c2564631fb666ba6cd
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
355a899a6c3edc08b2518330f70df73c1ac8a2e6b8ab241c75c63cdecb691b9e
3759e8a491866813c5aa87d889c3471a46da21deb2f5c1298d3dc4cd59c88568
3de4dc603ae60f8e587845aeb08cc9aee76aaa9db8452c1413f1adfd3edc4102
3decf22795bbd3fca66f2438ff290db107fdcb21ef0c0f582fe8429d7c3b33f0
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954
45a04c7005bb41f2314b6009e60eac10dd0391def8420cac4401442355e09c82
45b51b7609f772ed76d38d5617e13adfbacc2e576234d5845c72558be8bca1d6
4602e984723c771d8eef88cbaf635e5db2becf4780a4d677089bf68244b13d63
475bebdeebcba2b0c9ea6e090b21682e61ab214be27f67928fb7c8e1940041f0
48390c7a04979865204972f6f0dd36774ae2d541d986eb23585ead25870ff9e3
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4d686f7f6dff458e7a84bc1317260d4a9b74d35f19c779c95a61131ff1f4d6f9
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
4f0513682448e2d2daf4bc364cfdd5b8e9a27f90d6292ab71b705da1b155e83b
50689dfb1260231668827e97274448ee7e035a3ba815dd907b10c94dbd5accff
544d61a5954086f1812071dca3a6b2f60f66862b3b45a508bc61391da9109347
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020
559f4ba86cefc3676ed2b23310a82a9fcee616a399bbfe2436910a9cfdb4dd07
56564e0e31cd96293fecac7b933eeec3168e0e2d960cccd7c8e1c2a05e19b197
5853022914f5075dc37fb45f3cc35370d3004dc85dd3cfd8d7e63a4584485a32
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5a72e2e47b09ebb15e505f122de6e711741a774faf69b0e7c5d8835440d5de3f
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5d0ba145cad4df5f63f2b7536dc6ad15727f54ce8c1d1e5a51a38a7f57907d96
5dee61d09dc42a128fc6c38a3c7b116fa8876ca8497ef8d354e4845fbc4d2804
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
63c28908fa31c62647090210628b113673bee253cd57c0499569bf68cebdce55
68cb4c14df41eeca7d8cc5fb44d1a3e1b9186b735e6aa3bc915f9412f99ea84a
6a67bc42547f06aeb61a9832ca081333446c516a6269f545d403c07f71822588
6d217d1c0c2f8e60d9728b9512ea94a358b000673a9ae41dd3474fd71e67e20d
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6e1cf3be4efad8bcc621be807ef43fae10ae179a960ecc6493f0bc7a4d5dba44
6f6cee6f6abd156a1dd2fe5891d12ecdb65d18ec8dfe32bd83451f6c08a4a95e
708e35f846bc89ecb31ef93fbe98fee0c40e80e394732ba020d3cda631d7730b
71bc184b89d329f7fe79c88d9c2bcbca2369f95308f8535b6af8f35158ecc4c7
7384937c810ed8b1f3c2636abadeb7cd6119648fd126b05dc0d5a8bbbb3c2ef0
757ca070863b243bea26c52abecf037c1941018a70f196713cf552aeeabeaec7
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
766108dbf2f97de17c3fe9fd539b002c874d396772aa0df3283fc6c077fafa12
773514f1e549833bd8347bac676f2c0e9cd6ca68c5490a7ded9572eefff6e4a9
7751b706f0e0b70939bac114d3828d092891997600268ea75959c3378c536b1a
78253896640573f5c97f4d0c21c5cf830c93d31cb4dba26faa74d53a15474491
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
7ed1351375326158a611b20b9f3623364fd5e4b88166c22c58c13e83638f634b
8212b4b59216f2b34dc1889ffd1c2ece0f153638628a54705e16273d6de2530c
8311bc3a855c02e96954acba57ca59878afff0d519b0a161df0e75f95f49fe4a
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
850a4c6decf68c2ff186703ea85e4703dd5c285a2e42fe47d974b3ad7455a4fb
856b6741d6962986a71978b5372c1448273435052c75c498d926fbecbb974e9b
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
8ba3ec7c2c7eacf9a5d8d36238d055b152c7121152d774aef7eccd0718366e53
8f9e3075a33d7c4cf61ed4384884c4347f10c0d77017c24bb9dfd49ab42954fe
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9929178d3ef84192348fc6263feefdd22794a16a8a6b70d4e5d8d9e85fdf1f2a
999fb3d31824ff12dd46136a91e842d59db4103411da7950e21863872aa2fcb1
9ad533655968292ca93504ed0176ee49af127aa4f5fda3de908747d56fc97c9b
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9e32017de88a0242ba838a7d7e4c6502361d1f1182b23e1e58ea341063a61a22
a1e788adb2429a92ecb84b5feefd533973ee377f8304cbb037e9cd857d6cd538
a21152f88b2f121e232e77e41c2f2aaec6134e0d97ff898d8d1f92f3752bf51d
a31ff3b4e5c1cb8373ae5a092a6b78c340b8cefc09dcd59045bcd2d41fc9443e
a43196cef5e2a4bc71ea63265be5fce317c5abdca3b9fd708dfdc771ed780518
a62f5daff85d4695d52eb94efef62aea68deb1eb2baaa3c6463d6f95dadbb240
a9e7fb5d534c94e5002bd4e5c8bb4cd41dc25de2e3b0f4dfbc2d53b003609577
aa2310067af2900a9d6bef7ded9d40cd8a8f620b8e60eb6f01298745c385c5d3
aa4a8d3186047ca0dacbbc42e303bdc292e16ad07b31d3a6581ac8727720820b
ab09c964090782685ba8d99d63320e82c3fa514d2d9b9fc023f5dbac0c288f24
ac3fd72c715cf0c48d6261a23516c25fd67c6db949bb2ab4331b8d32886b002a
ade647cbdadc97e5b51be05d1a4d158981dd24ead69e64ac2a3af095c85bc9aa
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
af837b5592f328e2ea68ecbd900385a260bca784d41fc9c021ec4a2d9c058589
afaa1039e9c9e8d2e8e849cb497972a4b0b43390bbac8d481e999359a82c151b
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b027fc110a1c4310d433d4be3ffa26b70886ed33a1ec1a2b8270588519507f00
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b35ffa7e9fbf32b23825426337486daf9ed2ebff26a656202cc7dc5dcbd6e182
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b9a43cb4bbe032b5e3bf828b71d7d5b0a4cddf703a327a5a478ee6c13970d164
bcbb7f7a45bda0445c0f861217bd4766f126d88e6f005f749df8a6e997a40f96
c022284176affb7b8875b60c2d6aadfa8905c92cbd2f790eb080ecebab96c0c2
c08aa5078a5a2a244f92077b9f8d701ece881b096be8f5dced227d8ae2c2e760
c0c4599883d0df3454b2211aecec6d746816bc4c10916a2e59f19ceae08c2c60
cee613af53edabf594bf89b5af409279d2d0e3d2a641eff837d4ffe495299276
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d5148bf2db30affd91bb278169d81a74c60f27060a0d8d9961b3a58c10769a63
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d77b6c18c0744a7ad3e394c6de665cfec35053d2ccc2e3d31aaece762cf6bbfd
d8ca962217e5ce12ac4d7d2de6a18d552ceb4d8e1a4a2de58cbd192733fdbbe9
de694f5b73923338521a80f7c41622c4395cdfce667ea63dbb24239881087032
dee70d789d24720c1c8d0765e42c1394063692be6ccd91c547610558c8ba75ea
dfbe8961e004e84af6c834063fcd829c59bab8e3904b93d0cd63f5eb215fd862
e04546f3c2c00f237774a2f85861db5040ca708d188918116f542b304f4e9bdc
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e4af86fe5e5ac087b6e940db24da1c877da8feb34b74d72c78488b12cb726af4
e5ab2409c8af2c590ffae89826aeb3966d5decfed18a8f307aaab201b78bf1a6
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e77d504ae0f3d20331cde98903c5491f120f31db02d4270fdb76b7ee98082bfe
e86856dd34dca8070a958897a81d82e58b7b777dcdefd22c4f9a4ccdd8bddc94
e87217e45ca81de8e3ce6d47c98bcdcef0bc746607d3bbcc0d60fc1283b78ca1
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
e9ce46e8ee41d0f52c72c6e33af7b559667a79e1c77725e1a796066c92014671
e9cf77edb95978fa6b193724ee40fde091368427e030fed8735cdef6b1a35535
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f070a404ffa3b35fb0636c3172879da6e87e3703bdb7b225c1872aec5a201c5e
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f4a292ea2bfcac61e3294d3eefa6114f519b4e5669dc20d43fb514b97d1f7b33
f86194d145cf109f794344c197a0ddf0ce7a37975833f8b97255b4771e056458
f86b70f6a693273480dcde347052929ca26f16c212eddd5aef1dca024df86f95
f8a3399e4886015e3fa0fe1be7adda872ea163f264618713c4d117737dd58a85
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548
ff2a0cfc6a0b2cab1ea140220e289d2b2db9aad7e06ab31bc1dcceea98fddf62
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe
ff7032357e731ba3db793a9e992f06287664f092a3731d38e9cd05b5ccdcb13b