Submitted URL: http://www.chip.de/downloads/Android-File-Transfer_53192185.html
Effective URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Submission: On September 10 via manual from CA

Summary

This website contacted 69 IPs in 8 countries across 51 domains to perform 224 HTTP transactions. The main IP is 2a02:26f0:6c00:28c::bf0, located in European Union and belongs to AKAMAI-ASN1, US. The main domain is www.chip.de.
TLS certificate: Issued by GeoTrust RSA CA 2018 on June 7th 2018. Valid for: a year.
This is the only time www.chip.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 4 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
27 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
5 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
4 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 52.222.147.244 16509 (AMAZON-02)
2 2.18.234.190 16625 (AKAMAI-AS)
1 52.94.220.16 16509 (AMAZON-02)
1 91.215.103.64 43407 (INFONLINE-AS)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.100.40 43407 (INFONLINE-AS)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
6 2a00:1450:400... 15169 (GOOGLE)
1 52.222.146.214 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
2 52.222.150.61 16509 (AMAZON-02)
2 52.18.166.37 16509 (AMAZON-02)
1 52.208.52.41 16509 (AMAZON-02)
24 2.18.232.233 16625 (AKAMAI-AS)
1 178.250.0.93 44788 (ASN-CRITE...)
1 107.178.241.34 15169 (GOOGLE)
1 18.185.168.60 16509 (AMAZON-02)
1 2a03:2880:f01... 32934 (FACEBOOK)
1 52.30.15.212 16509 (AMAZON-02)
2 6 185.33.223.197 29990 (ASN-APPNEXUS)
14 172.217.21.194 15169 (GOOGLE)
8 151.101.134.2 54113 (FASTLY)
8 64.202.112.28 23352 (SERVERCEN...)
1 2600:9000:204... 16509 (AMAZON-02)
1 2600:9000:204... 16509 (AMAZON-02)
6 31.24.80.101 56464 (VIBRANT-EU)
1 46.137.113.194 16509 (AMAZON-02)
3 104.108.48.32 16625 (AKAMAI-AS)
1 3 63.140.40.124 15224 (OMNITURE)
5 52.222.150.73 16509 (AMAZON-02)
9 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
1 54.72.140.158 16509 (AMAZON-02)
1 85.114.144.199 24961 (MYLOC-AS)
1 1 2001:16e0:10a... 12611 (RKOM R-KO...)
4 4 85.114.159.118 24961 (MYLOC-AS)
1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 3 85.114.144.106 24961 (MYLOC-AS)
1 2a00:cd0:1005... 48173 (UNBELIEVA...)
2 52.222.150.126 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
1 52.208.127.173 16509 (AMAZON-02)
4 52.222.150.113 16509 (AMAZON-02)
1 52.222.150.78 16509 (AMAZON-02)
1 2.18.234.21 16625 (AKAMAI-AS)
1 4 176.34.121.0 16509 (AMAZON-02)
1 46.137.126.71 16509 (AMAZON-02)
1 1 85.114.159.93 24961 (MYLOC-AS)
3 3 77.66.11.200 16245 (NGDC)
2 2 185.33.223.220 29990 (ASN-APPNEXUS)
1 35.157.25.10 16509 (AMAZON-02)
1 1 172.217.22.2 15169 (GOOGLE)
2 2 54.171.22.132 16509 (AMAZON-02)
2 2 37.157.6.245 198622 (ADFORM)
3 3 18.153.11.28 16509 (AMAZON-02)
3 3 185.29.135.233 30419 (MEDIAMATH...)
1 1 185.31.128.129 54312 (ROCKETFUEL)
3 54.154.14.76 16509 (AMAZON-02)
1 148.251.151.243 24940 (HETZNER-AS)
5 2a00:1450:400... 15169 (GOOGLE)
2 2 18.194.100.124 16509 (AMAZON-02)
3 4 172.217.21.198 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
1 2a01:4f8:202:... 24940 (HETZNER-AS)
1 144.76.220.226 24940 (HETZNER-AS)
1 148.251.139.104 24940 (HETZNER-AS)
5 104.109.71.169 20940 (AKAMAI-ASN1)
1 2a00:1450:400... 15169 (GOOGLE)
4 34.252.16.212 16509 (AMAZON-02)
1 52.222.153.135 16509 (AMAZON-02)
1 54.154.209.235 16509 (AMAZON-02)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
2 52.48.133.165 16509 (AMAZON-02)
1 34.242.119.131 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
224 69
Apex Domain
Subdomains
Transfer
38 chip.de
www.chip.de
adtm.chip.de
ad-js.chip.de
filestorage.chip.de
videos.chip.de
rt.chip.de
somniture.chip.de
videoembed.chip.de
ssl.3.damoh.chip.de
ssl.1.damoh.chip.de
742 KB
25 yieldlab.net
ad.yieldlab.net
p.yieldlab.net
counts.yieldlab.net
22 KB
19 doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
ad.doubleclick.net
110 KB
18 outbrain.com
widgets.outbrain.com
amplify.outbrain.com
tr.outbrain.com
amplifypixel.outbrain.com
32 KB
14 unrulymedia.com
video.unrulymedia.com
stats3.unrulymedia.com
cloud-video.unrulymedia.com
targeting.unrulymedia.com
targaryen.unrulymedia.com
72 KB
14 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
209 KB
8 intellitxt.com
k.intellitxt.com
images.intellitxt.com
61 KB
8 adnxs.com
ib.adnxs.com
6 KB
7 adup-tech.com
s.d.adup-tech.com
d.adup-tech.com
16 KB
6 smartclip.net
des.smartclip.net
dco.smartclip.net
ad.sxp.smartclip.net
114 KB
6 bf-ad.net
a.bf-ad.net
47 KB
5 ampproject.org
cdn.ampproject.org
244 KB
5 adition.com
dsp.adfarm1.adition.com
2 KB
5 svonm.com
hgc-cf-cache-1.svonm.com
55 KB
5 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
10 KB
5 bf-tools.net
a.bf-tools.net
67 KB
3 mathtag.com
sync.mathtag.com
2 KB
3 bidswitch.net
x.bidswitch.net
2 KB
3 semasio.net
uip.semasio.net
2 KB
3 theadex.com
xpl.theadex.com
dmp.theadex.com
2 KB
3 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
109 KB
2 appspot.com
amp-error-reporting.appspot.com
219 B
2 gstatic.com
csi.gstatic.com
258 B
2 myvisualiq.net
t.myvisualiq.net
2 KB
2 adform.net
c1.adform.net
307 B
2 adsrvr.org
match.adsrvr.org
835 B
2 2mdn.net
s0.2mdn.net
12 KB
2 df-srv.de
d.df-srv.de
1 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 go-mpulse.net
s.go-mpulse.net
c.go-mpulse.net
56 KB
2 google.com
adservice.google.com
www.google.com
242 B
2 xplosion.de
ups.xplosion.de
5 KB
2 conative.de
cdn.conative.de
72 KB
2 amazon-adsystem.com
c.amazon-adsystem.com
aax.amazon-adsystem.com
7 KB
1 akstat.io
364bf6be.akstat.io
199 B
1 plista.com
farm.plista.com
771 B
1 rfihub.com
p.rfihub.com
683 B
1 eyeota.net
ps.eyeota.net
140 B
1 krxd.net
beacon.krxd.net
453 B
1 casalemedia.com
ssum-sec.casalemedia.com
288 B
1 consensu.org
vibrant.mgr.consensu.org
1 nuggad.net
smartclip.nuggad.net
1 KB
1 emetriq.de
cdn.emetriq.de
2 KB
1 google.de
adservice.google.de
171 B
1 facebook.com
an.facebook.com
1 KB
1 3lift.com
tlx.3lift.com
769 B
1 nativendo.de
d.nativendo.de
785 B
1 criteo.com
bidder.criteo.com
185 B
1 wfxtriggers.com
partners.wfxtriggers.com
385 B
1 googletagservices.com
www.googletagservices.com
8 KB
1 cloudfront.net
d3alqb8vzo7fun.cloudfront.net
39 KB
224 51
Domain Requested by
22 ad.yieldlab.net a.bf-ad.net
ad.yieldlab.net
www.chip.de
14 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.chip.de
10 adtm.chip.de www.chip.de
adtm.chip.de
10 www.chip.de 1 redirects www.chip.de
a.bf-ad.net
9 tpc.googlesyndication.com securepubads.g.doubleclick.net
www.chip.de
8 amplifypixel.outbrain.com www.chip.de
8 tr.outbrain.com www.chip.de
8 ib.adnxs.com 4 redirects a.bf-ad.net
6 k.intellitxt.com ad-js.chip.de
k.intellitxt.com
images.intellitxt.com
www.chip.de
6 a.bf-ad.net www.chip.de
ad-js.chip.de
a.bf-ad.net
5 stats3.unrulymedia.com www.chip.de
5 video.unrulymedia.com a.bf-ad.net
video.unrulymedia.com
ajax.googleapis.com
5 cdn.ampproject.org securepubads.g.doubleclick.net
5 dsp.adfarm1.adition.com 5 redirects
5 hgc-cf-cache-1.svonm.com filestorage.chip.de
text
5 pagead2.googlesyndication.com ad-js.chip.de
securepubads.g.doubleclick.net
www.chip.de
5 filestorage.chip.de www.chip.de
filestorage.chip.de
text
5 a.bf-tools.net www.chip.de
a.bf-tools.net
4 ad.doubleclick.net 3 redirects www.chip.de
4 ad.sxp.smartclip.net 1 redirects www.chip.de
dco.smartclip.net
4 s.d.adup-tech.com ad.yieldlab.net
s.d.adup-tech.com
4 videos.chip.de ad-js.chip.de
www.chip.de
3 d.adup-tech.com s.d.adup-tech.com
3 sync.mathtag.com 3 redirects
3 x.bidswitch.net 3 redirects
3 uip.semasio.net 3 redirects
3 somniture.chip.de 1 redirects www.chip.de
3 de.ioam.de 2 redirects www.chip.de
2 amp-error-reporting.appspot.com cdn.ampproject.org
2 targaryen.unrulymedia.com ajax.googleapis.com
www.chip.de
2 csi.gstatic.com imasdk.googleapis.com
tpc.googlesyndication.com
2 t.myvisualiq.net 2 redirects
2 ssl.3.damoh.chip.de text
2 c1.adform.net 2 redirects
2 match.adsrvr.org 2 redirects
2 counts.yieldlab.net www.chip.de
2 s0.2mdn.net imasdk.googleapis.com
www.chip.de
2 images.intellitxt.com k.intellitxt.com
images.intellitxt.com
2 xpl.theadex.com 1 redirects www.chip.de
2 d.df-srv.de 1 redirects www.chip.de
2 imasdk.googleapis.com filestorage.chip.de
imasdk.googleapis.com
2 ups.xplosion.de a.bf-ad.net
cdn.emetriq.de
2 cdn.conative.de a.bf-ad.net
cdn.conative.de
1 364bf6be.akstat.io s.go-mpulse.net
1 targeting.unrulymedia.com ajax.googleapis.com
1 cloud-video.unrulymedia.com ajax.googleapis.com
1 ajax.googleapis.com video.unrulymedia.com
1 c.go-mpulse.net s.go-mpulse.net
1 ssl.1.damoh.chip.de text
1 farm.plista.com dco.smartclip.net
1 www.google.com www.chip.de
1 p.rfihub.com 1 redirects
1 cm.g.doubleclick.net 1 redirects
1 ps.eyeota.net www.chip.de
1 dmp.theadex.com www.chip.de
1 beacon.krxd.net www.chip.de
1 ssum-sec.casalemedia.com www.chip.de
1 vibrant.mgr.consensu.org images.intellitxt.com
1 adstax-match.adrtx.net cdn.adrtx.net
1 smartclip.nuggad.net des.smartclip.net
1 p.yieldlab.net www.chip.de
1 cdn.adrtx.net www.chip.de
1 videoembed.chip.de filestorage.chip.de
1 s.go-mpulse.net adtm.chip.de
1 rt.chip.de www.chip.de
1 cdn.emetriq.de ups.xplosion.de
1 dco.smartclip.net des.smartclip.net
1 amplify.outbrain.com www.chip.de
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 des.smartclip.net a.bf-ad.net
1 an.facebook.com a.bf-ad.net
1 tlx.3lift.com a.bf-ad.net
1 d.nativendo.de a.bf-ad.net
1 bidder.criteo.com a.bf-ad.net
1 partners.wfxtriggers.com a.bf-ad.net
1 www.googletagservices.com a.bf-ad.net
1 d3alqb8vzo7fun.cloudfront.net a.bf-tools.net
1 irqs.ioam.de script.ioam.de
1 script.ioam.de adtm.chip.de
1 aax.amazon-adsystem.com c.amazon-adsystem.com
1 widgets.outbrain.com www.chip.de
1 ad-js.chip.de www.chip.de
1 c.amazon-adsystem.com www.chip.de
224 84
Subject Issuer Validity Valid
*.chip.de
GeoTrust RSA CA 2018
2018-06-07 -
2019-12-06
a year crt.sh
*.bf-ad.net
DigiCert SHA2 Secure Server CA
2018-07-13 -
2020-01-11
a year crt.sh
bf-tools.net
DigiCert ECC Secure Server CA
2018-07-26 -
2019-04-25
9 months crt.sh
c.amazon-adsystem.com
Amazon
2018-03-12 -
2019-03-12
a year crt.sh
*.outbrain.com
DigiCert SHA2 Secure Server CA
2018-02-12 -
2019-02-12
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-03-08 -
2019-03-08
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-08-21 -
2018-11-13
3 months crt.sh
*.cloudfront.net
DigiCert Global CA G2
2017-11-22 -
2018-11-21
a year crt.sh
cdn.conative.de
Amazon
2017-12-28 -
2019-01-28
a year crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-03-06 -
2019-01-12
10 months crt.sh
*.wfxtriggers.com
DigiCert SHA2 Secure Server CA
2018-02-23 -
2020-02-28
2 years crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-02-08 -
2019-02-08
a year crt.sh
*.criteo.com
DigiCert SHA2 Secure Server CA
2017-11-21 -
2018-11-26
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2018-02-09 -
2019-05-11
a year crt.sh
*.3lift.com
Amazon
2018-07-31 -
2019-08-31
a year crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2017-12-15 -
2019-03-22
a year crt.sh
*.smartclip.net
Amazon
2018-04-26 -
2019-05-26
a year crt.sh
*.google.com
Google Internet Authority G3
2018-08-21 -
2018-11-13
3 months crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2018-01-25 -
2019-01-25
a year crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2018-09-06 -
2019-09-07
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.intellitxt.com
SSL.com DV CA
2017-08-07 -
2018-11-05
a year crt.sh
rt.chip.de
Amazon
2018-01-09 -
2019-02-09
a year crt.sh
akstat.io
DigiCert ECC Secure Server CA
2018-03-12 -
2019-05-11
a year crt.sh
somniture.chip.de
DigiCert SHA2 High Assurance Server CA
2018-08-26 -
2019-11-29
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2018-08-21 -
2018-11-13
3 months crt.sh
*.googleapis.com
Google Internet Authority G3
2018-08-21 -
2018-11-13
3 months crt.sh
*.adrtx.net
Amazon
2017-10-25 -
2018-11-25
a year crt.sh
*.df-srv.de
thawte SHA256 SSL CA
2016-12-12 -
2019-12-12
3 years crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.nuggad.net
Gandi Standard SSL CA 2
2018-01-12 -
2020-01-16
2 years crt.sh
images.intellitxt.com
Amazon
2017-12-23 -
2019-01-23
a year crt.sh
*.doubleclick.net
Google Internet Authority G3
2018-08-21 -
2018-11-13
3 months crt.sh
*.adup-tech.com
Amazon
2018-08-30 -
2019-09-30
a year crt.sh
vibrant.mgr.consensu.org
Amazon
2018-05-19 -
2019-06-19
a year crt.sh
san.casalemedia.com
GeoTrust RSA CA 2018
2018-04-16 -
2019-02-06
10 months crt.sh
*.krxd.net
Go Daddy Secure Certificate Authority - G2
2017-06-12 -
2019-07-11
2 years crt.sh
www.eyeota.com
COMODO RSA Domain Validation Secure Server CA
2018-02-12 -
2021-02-11
3 years crt.sh
ssl.1.damoh.chip.de
Let's Encrypt Authority X3
2018-07-24 -
2018-10-22
3 months crt.sh
misc-sni.google.com
Google Internet Authority G3
2018-08-21 -
2018-11-13
3 months crt.sh
www.google.com
Google Internet Authority G3
2018-08-21 -
2018-11-13
3 months crt.sh
*.plista.com
COMODO RSA Domain Validation Secure Server CA
2017-04-11 -
2020-07-10
3 years crt.sh
*.unrulymedia.com
DigiCert SHA2 Secure Server CA
2018-04-18 -
2019-04-18
a year crt.sh
*.appspot.com
Google Internet Authority G3
2018-08-21 -
2018-11-13
3 months crt.sh

This page contains 18 frames:

Primary Page: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Frame ID: 73AD0953DAFE817D5FD0C2D060D378FC
Requests: 150 HTTP requests in this frame

Frame: https://a.bf-tools.net/cmp/hub.html
Frame ID: D109762F2479E839562A4BBB24C334EA
Requests: 1 HTTP requests in this frame

Frame: https://s.go-mpulse.net/boomerang/DG6LL-C2K3J-45PG2-VMF2Q-KM6V9
Frame ID: 45EF8A36D14E88D8F5389DA87ECA6E35
Requests: 2 HTTP requests in this frame

Frame: https://imasdk.googleapis.com/js/core/bridge3.234.1_en.html
Frame ID: A260C1700F1112A0B70DBD02CD78FF57
Requests: 1 HTTP requests in this frame

Frame: https://ad.yieldlab.net/d/2355058/21691/970x250?ts=1536589718030&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Frame ID: 740A29C8C6C1F4E80E049FC6ECF61E69
Requests: 24 HTTP requests in this frame

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

Frame: data://truncated
Frame ID: 7A6F23BC6937E79F547FEB23C2202ED8
Requests: 2 HTTP requests in this frame

Frame: https://vibrant.mgr.consensu.org/readconsent.html
Frame ID: 201F033BF5C33F2D028055B19004AA17
Requests: 1 HTTP requests in this frame

Frame: https://ad.yieldlab.net/d/27572/21691/160x600?ts=1536589718190&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Frame ID: 976FC2B0777DC09206441662E1F13B97
Requests: 8 HTTP requests in this frame

Frame: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js
Frame ID: E65BBC07ECFA8AAC7010081A6C962FC5
Requests: 8 HTTP requests in this frame

Frame: https://d.adup-tech.com/iframe?p=b0a301db334008753f83ff78ea6764f9&s=1&f=01&id=76tduf7t&uid=ssJ06O6P0-ln-WDt1W8P&surl=www.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html
Frame ID: E66A0F7CE4E75087CC11A48E1164AC89
Requests: 1 HTTP requests in this frame

Frame: https://d.adup-tech.com/iframe?p=69139504101a193487ed1eb4af979f65&s=1&f=01&id=4dwduf64&uid=ssJ06O6P0-ln-WDt1W8P&surl=www.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html
Frame ID: AC99AA8A8833460A6F49E44F5E8F9100
Requests: 1 HTTP requests in this frame

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

Frame: https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
Frame ID: C8260D1BA68B6F166D10A473403C778C
Requests: 12 HTTP requests in this frame

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

Frame: https://tpc.googlesyndication.com/pagead/js/r20180904/r20110914/activeview/osd_listener.js
Frame ID: 0F3BBDA820D65724A797EE4E4C70D9BD
Requests: 3 HTTP requests in this frame

Frame: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js
Frame ID: 5168D5A932D33800972758E62C86DB2B
Requests: 6 HTTP requests in this frame

Frame: https://video.unrulymedia.com/iframes/third-party-iframes.html?h=v1.0.1155-4-g960324b&siteId=1026066&gdpr=1&gdpr_consent=BOT4PvXOT4PvpAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Frame ID: 668F5C2A93C78223731C6FEDBFA510F8
Requests: 1 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. http://www.chip.de/downloads/Android-File-Transfer_53192185.html HTTP 301
    https://www.chip.de/downloads/Android-File-Transfer_53192185.html Page URL

Detected technologies

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

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

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

Overall confidence: 100%
Detected patterns
  • script /googlesyndication\.com\//i
  • 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 /^Hammer$/i

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

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

Overall confidence: 100%
Detected patterns
  • env /^(?:OutbrainPermaLink|OB_releaseVer)$/i

Overall confidence: 100%
Detected patterns
  • env /^s_(?:account|objectID|code|INST)$/i

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

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

Page Statistics

224
Requests

94 %
HTTPS

29 %
IPv6

51
Domains

84
Subdomains

69
IPs

8
Countries

2117 kB
Transfer

6786 kB
Size

4
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://www.chip.de/downloads/Android-File-Transfer_53192185.html HTTP 301
    https://www.chip.de/downloads/Android-File-Transfer_53192185.html Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 19
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=0017659504c9743ec5b967f95&ep=1561556011&vr=409&id=s9k4qs&lt=1536589717432&ev=&cs=d883jr&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=0017659504c9743ec5b967f95&ep=1561556011&vr=409&id=s9k4qs&lt=1536589717432&ev=&cs=d883jr&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 87
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s68700513460966?AQB=1&ndh=1&pf=1&t=10%2F8%2F2018%2014%3A28%3A37%201%200&D=D%3D&fid=4C84469BB7195702-079F35F47EAAC35F&ce=UTF-8&pageName=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&ch=downloads&server=www.chip.de&events=event154%3D7&c1=D%3Dv7&v2=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&c3=D%3Dv15&v3=First%20Visit&v4=Weekday%7CMonday%7C4%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=macos&c8=c1_downloads&v8=n%2Fa&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.android.com&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c37=michael%20humpa&c38=visible&c40=n%2Fa&v42=mac%20und%20android%3A%20android%20file%20transfer&v43=7&c44=dtm%20CHIP%20Master&c46=chip_digital%7Cdownloads%7Cmacos%7Cartikel%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=13725907&v60=1_fm6che7o&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1 HTTP 302
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s68700513460966?AQB=1&pccr=true&vidn=2DCB3FCB053131F8-6000010DE0000391&&ndh=1&pf=1&t=10%2F8%2F2018%2014%3A28%3A37%201%200&D=D%3D&fid=4C84469BB7195702-079F35F47EAAC35F&ce=UTF-8&pageName=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&ch=downloads&server=www.chip.de&events=event154%3D7&c1=D%3Dv7&v2=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&c3=D%3Dv15&v3=First%20Visit&v4=Weekday%7CMonday%7C4%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=macos&c8=c1_downloads&v8=n%2Fa&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.android.com&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c37=michael%20humpa&c38=visible&c40=n%2Fa&v42=mac%20und%20android%3A%20android%20file%20transfer&v43=7&c44=dtm%20CHIP%20Master&c46=chip_digital%7Cdownloads%7Cmacos%7Cartikel%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=13725907&v60=1_fm6che7o&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Request Chain 110
  • 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=6599602586195195927
Request Chain 111
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasWDa3ESR-EiUZWsf-BiUABifkBS7-WDfABifABifABfrr HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000118281628380079&axd_pid=22&axd_fuid=BSasWDa3ESR-EiUZWsf-BiUABifkBS7-WDfABifABifABfrr
Request Chain 137
  • https://ib.adnxs.com/getuid?https%3A%2F%2Fk.intellitxt.com%2Fcsync%2F0%2Fappnexus%2F%24UID HTTP 302
  • https://ib.adnxs.com/bounce?%2Fgetuid%3Fhttps%253A%252F%252Fk.intellitxt.com%252Fcsync%252F0%252Fappnexus%252F%2524UID HTTP 302
  • https://k.intellitxt.com/csync/0/appnexus/2729869184897373167
Request Chain 140
  • https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&x=9&d1=2&d10=5&d11=0&d12=2&d2=4&d3=5&d4=0&d7=1&d8=1&d9=2&d13=4&d14=0&d15=4&d16=0&d18=0&i9=4&i13=3&i3=2&i21=4&i1=3&i14=4&i8=4&g1=0&g2=1&g3=0&g4=0&g5=1&n1=1&n2=1&n3=1&n4=0&n5=1&n6=1&n7=0&n8=1&n9=0&sinbest=5&s1=0&s2=0&survey_cap=1&frq_n=1&oneclicker=1&qualified=0&tv=2&ct_gnd=0&ct_qvc=0&d20=4&ct_agraf=0&ct_qc=0&nuggsid=474493238&ang_contxt=1&inswipe=true&cu_burda_pmp_redirect=1&optout=&consent=&rnd=38116368 HTTP 302
  • https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&x=9&d1=2&d10=5&d11=0&d12=2&d2=4&d3=5&d4=0&d7=1&d8=1&d9=2&d13=4&d14=0&d15=4&d16=0&d18=0&i9=4&i13=3&i3=2&i21=4&i1=3&i14=4&i8=4&g1=0&g2=1&g3=0&g4=0&g5=1&n1=1&n2=1&n3=1&n4=0&n5=1&n6=1&n7=0&n8=1&n9=0&sinbest=5&s1=0&s2=0&survey_cap=1&frq_n=1&oneclicker=1&qualified=0&tv=2&ct_gnd=0&ct_qvc=0&d20=4&ct_agraf=0&ct_qc=0&nuggsid=474493238&ang_contxt=1&inswipe=true&cu_burda_pmp_redirect=1&optout=&consent=&rnd=38116368&ang_testid=1
Request Chain 146
  • https://dsp.adfarm1.adition.com/cookie/?ssp=1 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=15233&ext_id=6599602586195195927
Request Chain 147
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fbeacon.krxd.net%2Fusermatch.gif%3Fpartner%3Dactiveagent%26partner_uid%3D%25%25COOKIE%25%25 HTTP 302
  • https://beacon.krxd.net/usermatch.gif?partner=activeagent&partner_uid=6599602586195195927
Request Chain 148
  • https://dsp.adfarm1.adition.com/cookie/?dmp=1&xxx=817 HTTP 302
  • https://dmp.theadex.com/d/817/i/2.gif?c=&axd_pid=14&axd_fuid=6599602586195195927
Request Chain 149
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fuip.semasio.net%2Fadition%2F1%2Finfo%3FsType%3Dsync%26sExtCookieId%3D%25%25COOKIE%25%25%26sInitiator%3Dyl HTTP 302
  • https://uip.semasio.net/adition/1/info?sType=sync&sExtCookieId=6599602586195195927&sInitiator=yl HTTP 302
  • https://uip.semasio.net/adition/1/info2?sType=sync&sExtCookieId=6599602586195195927&sInitiator=yl HTTP 302
  • https://ib.adnxs.com/getuid?https://uip.semasio.net/appnexusdata/1/info?stype=sync&sExtCookieId=$UID&sInitiator=internal HTTP 302
  • https://uip.semasio.net/appnexusdata/1/info?stype=sync&sExtCookieId=2729869184897373167&sInitiator=internal HTTP 302
  • https://ps.eyeota.net/match?uid=78F7E456BB6AB7E&pid=n4om0kv&r=https://uip.semasio.net/eyeota/1/info?sType=sync&sExtCookieId={UUID}&sInitiator=internal
Request Chain 150
  • https://cm.g.doubleclick.net/pixel?google_nid=yieldlab&google_cm&google_sc HTTP 302
  • https://ad.yieldlab.net/m?dt_id=52&ext_id=CAESEE_k6kz5QtigzuBFyzJrrDM&google_cver=1
Request Chain 151
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=yieldlab&ttd_tpi=1 HTTP 302
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=yieldlab&ttd_tpi=1 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=99739&ext_id=e53b0dd6-bfa8-4cdc-b343-a84181ab2a41
Request Chain 152
  • https://ib.adnxs.com/getuid?https://ad.yieldlab.net/m?dt_id=140420&ext_id=$UID HTTP 302
  • https://ad.yieldlab.net/m?dt_id=140420&ext_id=2729869184897373167
Request Chain 153
  • https://c1.adform.net/serving/cookie/match?party=6 HTTP 302
  • https://c1.adform.net/serving/cookie/match?CC=1&party=6 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=4879&ext_id=682417499596931646
Request Chain 154
  • https://x.bidswitch.net/sync?ssp=yieldlab HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=yieldlab HTTP 302
  • https://sync.mathtag.com/sync/img?mt_exid=46&redir=%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D80%26user_id%3D%5BUUID%5D%26expires%3D30%26ssp%3Dyieldlab%26bsw_param%3D89c4f792-b13a-4afc-82ea-12dbadc8991c HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=80&user_id=c7b85b96-7ae7-4500-8e79-709e7bf9e0f1&expires=30&ssp=yieldlab&bsw_param=89c4f792-b13a-4afc-82ea-12dbadc8991c HTTP 302
  • https://ad.yieldlab.net/m?dt_id=6850&ext_id=89c4f792-b13a-4afc-82ea-12dbadc8991c
Request Chain 155
  • https://p.rfihub.com/cm?pub=19593&in=1 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1040683376445288901
Request Chain 156
  • https://sync.mathtag.com/sync/img?mt_exid=118&redir=https%3A%2F%2Fad.yieldlab.net%2Fm%3Fdt_id%3D6061522%26ext_id%3D%5BMM_UUID%5D HTTP 302
  • https://sync.mathtag.com/sync/img?mt_exid=118&redir=https%3A%2F%2Fad.yieldlab.net%2Fm%3Fdt_id%3D6061522%26ext_id%3D%5BMM_UUID%5D&mm_bnc&mm_bct HTTP 302
  • https://ad.yieldlab.net/m?dt_id=6061522&ext_id=c7b85b96-7ae7-4500-8e79-709e7bf9e0f1
Request Chain 176
  • https://t.myvisualiq.net/impression_pixel?r=438922656&et=i&ago=212&ao=537&aca=10860715&si=3230043&ci=78556514&pi=145163035&ad=-18&advt=5862390&chnl=-18&vndr=115&sz=9112&u=-18&pt=i&red=https%3A%2F%2Fad.doubleclick.net%2Fddm%2Ftrackimp%2FN408002.112081CHIP.DE%2FB10860715.145163035%3Bdc_trk_aid%3D316834343%3Bdc_trk_cid%3D78556514%3Bord%3D%5Btimestamp%5D%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D%3F HTTP 302
  • https://t.myvisualiq.net/ul_cb/impression_pixel?r=438922656&et=i&ago=212&ao=537&aca=10860715&si=3230043&ci=78556514&pi=145163035&ad=-18&advt=5862390&chnl=-18&vndr=115&sz=9112&u=-18&pt=i&red=https%3A%2F%2Fad.doubleclick.net%2Fddm%2Ftrackimp%2FN408002.112081CHIP.DE%2FB10860715.145163035%3Bdc_trk_aid%3D316834343%3Bdc_trk_cid%3D78556514%3Bord%3D%5Btimestamp%5D%3Bdc_lat%3D%3Bdc_rdid%3D%3Btag_for_child_directed_treatment%3D%3Btfua%3D%3F HTTP 302
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860715.145163035;dc_trk_aid=316834343;dc_trk_cid=78556514;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua= HTTP 302
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860715.145163035;dc_pre=CNzT-eLSsN0CFY4m4Aod7k8K2A;dc_trk_aid=316834343;dc_trk_cid=78556514;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
Request Chain 208
  • https://ad.doubleclick.net/ddm/ad/N9551.2010700FORWARDADGROUP/B10146152.136200257;sz=1x1;ord=756788759;dc_lat=;dc_rdid=;tag_for_child_directed_treatment= HTTP 302
  • https://ad.doubleclick.net/ddm/ad/N9551.2010700FORWARDADGROUP/B10146152.136200257;dc_pre=COa1oePSsN0CFQuR3godwkoD8A;sz=1x1;ord=756788759;dc_lat=;dc_rdid=;tag_for_child_directed_treatment= HTTP 302
  • https://s0.2mdn.net/viewad/5195550/1x1_default.gif

224 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Android-File-Transfer_53192185.html
www.chip.de/downloads/
Redirect Chain
  • http://www.chip.de/downloads/Android-File-Transfer_53192185.html
  • https://www.chip.de/downloads/Android-File-Transfer_53192185.html
198 KB
80 KB
Document
General
Full URL
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
a6e4b3001b9006e3c0c658a2205b83c2088388fbbd90d9a2e7a9a3657d25ab49

Request headers

Host
www.chip.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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC

Response headers

Server
nginx
Content-Type
text/html
Vary
Accept-Encoding
Content-Encoding
gzip
SSL
YES
Cache-Control
public, max-age=799
Expires
Mon, 10 Sep 2018 14:41:56 GMT
Date
Mon, 10 Sep 2018 14:28:37 GMT
Transfer-Encoding
chunked
Connection
keep-alive Transfer-Encoding

Redirect headers

Server
AkamaiGHost
Content-Length
0
Location
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Date
Mon, 10 Sep 2018 14:28:37 GMT
Connection
keep-alive
ads_fol_init.js
a.bf-ad.net/makabo/
33 B
445 B
Script
General
Full URL
https://a.bf-ad.net/makabo/ads_fol_init.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
9ed3a2ae1ef227fdc6f09c78bcc9a1e590da910c1c276f96b2aaf86d6c4a952e

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Wed, 12 Oct 2016 15:59:48 GMT
Server
Apache
ETag
"e409fb3ff6dc33e64c3e5eefe750ace8:1476288013"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
53
Expires
Mon, 10 Sep 2018 14:43:37 GMT
cmp.js
a.bf-tools.net/cmp/
180 KB
53 KB
Script
General
Full URL
https://a.bf-tools.net/cmp/cmp.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:28f::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 03 Jul 2018 09:47:22 GMT
Server
Apache
ETag
"9622a4d644ee095821760ae6a6bc0084:1530611250"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=900
Transfer-Encoding
chunked
Connection
keep-alive, Transfer-Encoding
Accept-Ranges
bytes
Expires
Mon, 10 Sep 2018 14:43:37 GMT
download-v1.5.9.css
www.chip.de/download/assets/
300 KB
42 KB
Stylesheet
General
Full URL
https://www.chip.de/download/assets/download-v1.5.9.css
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
e4da1d289ab89639768b2685742ead0e6c31997e6b29d241cdcc4427998d1a64

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Fri, 29 Jun 2018 14:49:16 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
42808
Expires
Sat, 20 Jul 2019 07:27:57 GMT
speedtestwidget-v1.5.9.css
www.chip.de/download/assets/
79 KB
11 KB
Stylesheet
General
Full URL
https://www.chip.de/download/assets/speedtestwidget-v1.5.9.css
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
dfd9bd92ae5147930219f47fd1db6dc3de97b1287f5f453a549fc6e838abba0f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Fri, 29 Jun 2018 14:49:17 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
11047
Expires
Sat, 20 Jul 2019 07:26:31 GMT
satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/
118 KB
32 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
24c0ad02293c4d430bf9328484ea759625e1fffb5d820aa4530d592032746152

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Mon, 10 Sep 2018 06:52:16 GMT
server
AkamaiNetStorage
etag
"e58ad9e1982ea590f82d743c859ff2a5:1536562335.893358"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=281
accept-ranges
bytes
timing-allow-origin
*
content-length
31978
expires
Mon, 10 Sep 2018 14:33:18 GMT
amzn_ads.js
c.amazon-adsystem.com/aax2/
20 KB
7 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/amzn_ads.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.147.244 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-147-244.fra53.r.cloudfront.net
Software
Server /
Resource Hash
202db84a742a669d5cea67ac16a2c432547cdeb0922422897de274e72298e17c

Request headers

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

Response headers

Date
Thu, 30 Aug 2018 03:07:58 GMT
Content-Encoding
gzip
Server
Server
Age
40836
ETag
dc0cb68b1775b94b80ccf821f20521ff
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 b8b7a48d4425abc8f20c14956fccf2e5.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
6580
X-Amz-Cf-Id
p_2R-9W_zY7CDZbAiQdRfwmXRJDdfIbhr5ocJX3_cdhT1yjLBJ_KUA==
9232.min.js
ad-js.chip.de/js/chip/
142 KB
39 KB
Script
General
Full URL
https://ad-js.chip.de/js/chip/9232.min.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
4007ca91f49ad2614a59d9347cfc72fba4a35abee3e8e2ab07813b64db22bc1f

Request headers

:path
/js/chip/9232.min.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
ad-js.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 07:03:19 GMT
server
Apache
etag
"d6e7156706ec5c7f0b9c8451226f72c0:1536130999"
vary
Accept-Encoding
content-type
text/javascript; charset=utf-8
status
200
accept-ranges
bytes
content-length
40065
b97a02c547c62159.jpg
www.chip.de/ii/1/3/7/2/5/9/0/7/
2 KB
2 KB
Image
General
Full URL
https://www.chip.de/ii/1/3/7/2/5/9/0/7/b97a02c547c62159.jpg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
cf00d01204e6980f758858462f84aa567e85710b1f138546535fc3788f8f1b57

Request headers

:path
/ii/1/3/7/2/5/9/0/7/b97a02c547c62159.jpg
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
cache-control
no-cache
:authority
www.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Mon, 05 Dec 2011 11:39:44 GMT
server
nginx
vary
Accept-Encoding
content-type
image/jpeg
status
200
cache-control
public, max-age=12908657
accept-ranges
bytes
ssl
YES
content-length
2365
expires
Thu, 07 Feb 2019 00:12:54 GMT
bootstrap.3c21256c0e9dc3aaa93f.bundle.js
filestorage.chip.de/videoplayer/
31 KB
11 KB
Script
General
Full URL
https://filestorage.chip.de/videoplayer/bootstrap.3c21256c0e9dc3aaa93f.bundle.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0bd57dbc29c26c8db1dd5a00d5e39d294abb1ab823805458feadec8bb6fcc8b4

Request headers

:path
/videoplayer/bootstrap.3c21256c0e9dc3aaa93f.bundle.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
filestorage.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Thu, 06 Sep 2018 12:02:13 GMT
server
Apache
status
200
etag
"113ca9024b6f7f89ec94d207e707538f:1536235333"
vary
Accept-Encoding
access-control-allow-methods
GET,POST
content-type
application/x-javascript
access-control-allow-origin
*
access-control-max-age
86400
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
11437
outbrain.js
widgets.outbrain.com/
71 KB
26 KB
Script
General
Full URL
https://widgets.outbrain.com/outbrain.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
226c47b7d3427d9a1724333e73052536305778dce47c0f435d504f79744afd82

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Thu, 06 Sep 2018 12:10:48 GMT
Server
Apache
ETag
"64a91133c15cd8aad5e5f0b205d801d0:1536235848"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*, *
Cache-Control
max-age=604800
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
26121
installer_init-v1.5.9.js
www.chip.de/download/assets/
2 KB
1 KB
Script
General
Full URL
https://www.chip.de/download/assets/installer_init-v1.5.9.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
afd78436d7aa99bb2eaa5072f1f455a7e00fdf53c5cd9c19921b14e1c6c39b5f

Request headers

:path
/download/assets/installer_init-v1.5.9.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
www.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Fri, 29 Jun 2018 14:49:17 GMT
server
nginx
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=27285427
accept-ranges
bytes
ssl
YES
content-length
989
expires
Tue, 23 Jul 2019 09:45:44 GMT
hook-v1.5.9.js
www.chip.de/download/assets/
296 KB
100 KB
Script
General
Full URL
https://www.chip.de/download/assets/hook-v1.5.9.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
7db88358fc27c1bd55e13e06a6439e4f564a5c5bd75843413eff22a77f391c0e

Request headers

:path
/download/assets/hook-v1.5.9.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
www.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Fri, 29 Jun 2018 14:49:16 GMT
server
nginx
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=27285432
accept-ranges
bytes
ssl
YES
content-length
101614
expires
Tue, 23 Jul 2019 09:45:49 GMT
satellite-5b192bd364746d5acf000a29.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
816 B
1 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b192bd364746d5acf000a29.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
8eecf0a2944ad09c2017e2351de3edd35017eb94e1f3f412e4c942701f9f0687

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b192bd364746d5acf000a29.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
last-modified
Wed, 05 Sep 2018 12:29:34 GMT
server
AkamaiNetStorage
etag
"305c5b6044d799c22ddef1af3f8e191f:1536150574.267144"
content-type
application/x-javascript
status
200
cache-control
max-age=226
accept-ranges
bytes
timing-allow-origin
*
content-length
816
expires
Mon, 10 Sep 2018 14:32:23 GMT
satellite-57c58fcc64746d7a93007e3e.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
1 KB
761 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57c58fcc64746d7a93007e3e.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
63014e0db08db9a1ba9a35d531d3ccefa158e33f53f436142550ef0d0acd5b5f

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57c58fcc64746d7a93007e3e.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 12:29:31 GMT
server
AkamaiNetStorage
etag
"96e982946b194bcaffc7b790b9076db7:1536150571.167"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=160
accept-ranges
bytes
timing-allow-origin
*
content-length
518
expires
Mon, 10 Sep 2018 14:31:17 GMT
satellite-5a0ef85764746d0bbd0091aa.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
97 B
368 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef85764746d0bbd0091aa.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
e832be11265d7211c4d6a39727d1f1dc0deb7225138ac6bb9627df33446b8477

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef85764746d0bbd0091aa.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Mon, 10 Sep 2018 06:52:28 GMT
server
AkamaiNetStorage
etag
"18529802fc6a5d1e92de7afe937f15f1:1536562348.214747"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=226
accept-ranges
bytes
timing-allow-origin
* *
content-length
107
expires
Mon, 10 Sep 2018 14:32:23 GMT
bid
aax.amazon-adsystem.com/e/dtb/
33 B
212 B
Script
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3128&u=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&cb=1047296&gdprl=%7B%22status%22%3A%22cmp-in-flight%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/amzn_ads.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.220.16 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
09def6ea73f714a8b6f63b7ad4f7ecb708df079c893598e06966df827efb7dc4

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Intervention
<https://www.chromestatus.com/feature/5718547946799104>; level="warning"

Response headers

Date
Mon, 10 Sep 2018 14:28:37 GMT
Server
Server
Connection
keep-alive
Content-Length
33
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
satellite-5a0ef80d64746d0bc600a756.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
153 B
398 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef80d64746d0bc600a756.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
949a8bb15f2ab2ba00ee6c0d6689f7bfb555c873b833b626ac666602fd88d227

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef80d64746d0bc600a756.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Mon, 10 Sep 2018 06:52:29 GMT
server
AkamaiNetStorage
etag
"a498f4bc48298de88a8463c8fe9f1b0f:1536562349.249111"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=227
accept-ranges
bytes
timing-allow-origin
* *
content-length
135
expires
Mon, 10 Sep 2018 14:32:24 GMT
iam.js
script.ioam.de/
19 KB
7 KB
Script
General
Full URL
https://script.ioam.de/iam.js?m=1
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57c58fcc64746d7a93007e3e.js
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 0017
Resource Hash
1e2133170e649cfea51ed4afd733568930f2d4cc53961ed1fba84de58c2abd5b

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Mon, 10 Sep 2018 14:28:37 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 0017
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
Mon, 10 Sep 2018 16:28:37 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=chip&siteIdentifier=downloads&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.8248663597230197
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js?m=1
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.46.63.75 Bonn, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:37 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.chip.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=0017659504c9743ec5b967f95&ep=1561556011&vr=409&id=s9k4qs&lt=15...
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0017&i2=0017659504c9743ec5b967f95&ep=1561556011&vr=409&id=s9k4qs&lt=15...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.de/blank.gif
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Content-Length
43
Expires
Tue, 11 Sep 2018 14:28:37 GMT

Redirect headers

Date
Mon, 10 Sep 2018 14:28:37 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.04.6 0023
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Mon, 10 Sep 2018 14:28:37 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/blank.gif
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sun, 10 Sep 2017 14:28:37 GMT
hub.html
a.bf-tools.net/cmp/ Frame D109
0
0
Document
General
Full URL
https://a.bf-tools.net/cmp/hub.html
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/cmp/cmp.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:28f::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash

Request headers

Host
a.bf-tools.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.chip.de/downloads/Android-File-Transfer_53192185.html
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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html

Response headers

Server
Apache
ETag
"2ee839a3b060ee26afa4a0b56891050a:1530611251"
Last-Modified
Tue, 03 Jul 2018 09:47:22 GMT
Accept-Ranges
bytes
Content-Type
text/html
Vary
Accept-Encoding
Content-Encoding
gzip
Cache-Control
max-age=900
Expires
Mon, 10 Sep 2018 14:43:37 GMT
Date
Mon, 10 Sep 2018 14:28:37 GMT
Content-Length
5299
Connection
keep-alive
1.1.1.33-BF-RELEASE.chunk.js
a.bf-tools.net/cmp/
6 KB
3 KB
Script
General
Full URL
https://a.bf-tools.net/cmp/1.1.1.33-BF-RELEASE.chunk.js
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/cmp/cmp.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:28f::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 03 Jul 2018 09:47:22 GMT
Server
Apache
ETag
"c33e5fbfedd866c220a8c4fe54cdd90c:1530611250"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2388
Expires
Mon, 10 Sep 2018 14:43:37 GMT
0.1.1.33-BF-RELEASE.chunk.js
a.bf-tools.net/cmp/
35 KB
10 KB
Script
General
Full URL
https://a.bf-tools.net/cmp/0.1.1.33-BF-RELEASE.chunk.js
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/cmp/cmp.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:28f::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
1bfb94c4c4ed58fa8d0c81006a568c3f4d7efc4c453c58b11115ad6cf57d8e87

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Tue, 03 Jul 2018 09:47:22 GMT
Server
Apache
ETag
"b8a9e3acad393aa4ed16e622afc946fb:1530611250"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
9442
Expires
Mon, 10 Sep 2018 14:43:37 GMT
de.js
a.bf-tools.net/de/
3 KB
2 KB
Script
General
Full URL
https://a.bf-tools.net/de/de.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:284::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
027b0dddbb2d6e00584e3159aef14a2859f06a0c47621b166523e57752307a4d

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Mon, 27 Aug 2018 15:12:51 GMT
Server
Apache
ETag
"db2fb2658b1ab90036ba7b191bf95566:1535382772"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1561
Expires
Mon, 10 Sep 2018 14:43:37 GMT
18
videos.chip.de/p/1741931/thumbnail/entry_id/1_fm6che7o/width/640/height/360/
61 KB
62 KB
Image
General
Full URL
https://videos.chip.de/p/1741931/thumbnail/entry_id/1_fm6che7o/width/640/height/360/18
Requested by
Host: ad-js.chip.de
URL: https://ad-js.chip.de/js/chip/9232.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
0518773189fca34853eacbdd0915182e0a8942372199a109e7fb2a46e51374c9

Request headers

:path
/p/1741931/thumbnail/entry_id/1_fm6che7o/width/640/height/360/18
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
cache-control
no-cache
:authority
videos.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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-kaltura
cached-dispatcher-thumb
x-me
ny-front-thumb1
date
Mon, 10 Sep 2018 14:28:37 GMT
x-vod-session
450913213
status
200
content-length
62800
pragma
last-modified
Wed, 07 Mar 2018 16:18:34 GMT
server
nginx
vary
Accept-Encoding
x-vod-me
ny-front-vod10
content-type
image/jpeg
access-control-allow-origin
*
cache-control
public, max-age=3503
accept-ranges
bytes
expires
Mon, 10 Sep 2018 15:27:00 GMT
adengine.js
a.bf-ad.net/pubjs/chip/
158 KB
41 KB
Script
General
Full URL
https://a.bf-ad.net/pubjs/chip/adengine.js
Requested by
Host: ad-js.chip.de
URL: https://ad-js.chip.de/js/chip/9232.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
0d5dfd3690fb26eac90d5cfd9c75552a5f66766ed516fc5feb051bf1440bfdc4

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Thu, 06 Sep 2018 14:29:34 GMT
Server
Apache
ETag
"fbb9a13b44c0f26711947a93ab6d5802:1536244177"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=900
Transfer-Encoding
chunked
Connection
keep-alive, Transfer-Encoding
Accept-Ranges
bytes
Expires
Mon, 10 Sep 2018 14:43:37 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
73 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: ad-js.chip.de
URL: https://ad-js.chip.de/js/chip/9232.min.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:824::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
95f1c67bdd3a0fcd6a4aaea0916b983b178990c126296fd82f894f05bd040dca
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 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
27327
x-xss-protection
1; mode=block
server
cafe
etag
17011873601431810916
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Mon, 10 Sep 2018 14:28:37 GMT
c8c3489e-f329-40e8-bcfc-1f852e512b01-1.0.js
d3alqb8vzo7fun.cloudfront.net/
145 KB
39 KB
Script
General
Full URL
https://d3alqb8vzo7fun.cloudfront.net/c8c3489e-f329-40e8-bcfc-1f852e512b01-1.0.js
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/de/de.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.146.214 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-146-214.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
db8556e4c9fd6ef2cbf3f6802335c822229cb816980c6b0f3b16a92214f88aa2

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 13:43:49 GMT
content-encoding
gzip
last-modified
Mon, 10 Sep 2018 13:43:31 GMT
server
AmazonS3
age
289
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/x-javascript
status
200
cache-control
max-age=300
x-amz-cf-id
45CFCB1lbNP6w3eSXpYa3ap8WDN8Q5roJB10s4oyV-gqSdW8taLlCQ==
via
1.1 22e8ec6be29eb9755e0a8dfac5944c51.cloudfront.net (CloudFront)
main.3c21256c0e9dc3aaa93f.css
filestorage.chip.de/videoplayer/stylesheets/
71 KB
19 KB
Stylesheet
General
Full URL
https://filestorage.chip.de/videoplayer/stylesheets/main.3c21256c0e9dc3aaa93f.css
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/bootstrap.3c21256c0e9dc3aaa93f.bundle.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
38ea6fa80f05fd43cbeeef4410f1cfc6cd309cff879a782519735a7585654e6c

Request headers

:path
/videoplayer/stylesheets/main.3c21256c0e9dc3aaa93f.css
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
cache-control
no-cache
:authority
filestorage.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Thu, 06 Sep 2018 12:02:17 GMT
server
Apache
status
200
etag
"4ec5205e2bd0a5d87db7f7d9e0a0677b:1536235337"
vary
Accept-Encoding
access-control-allow-methods
GET,POST
content-type
text/css
access-control-allow-origin
*
access-control-max-age
86400
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
19448
truncated
/
59 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
0ddda9839c0f03c7cc800154368af8a65eeef1ad60c70559fa784d30f21b1165

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml;charset=utf-8
videoplayer.3c21256c0e9dc3aaa93f.bundle.js
filestorage.chip.de/videoplayer/
388 KB
103 KB
Script
General
Full URL
https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/bootstrap.3c21256c0e9dc3aaa93f.bundle.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
acb5bb4213314a2c2f339557c140ffd7febc186871522dc82b0f0580f979e6c4

Request headers

:path
/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
filestorage.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Thu, 06 Sep 2018 12:02:16 GMT
server
Apache
status
200
etag
"e391be6f544205a3e8113dacf38f68fc:1536235336"
vary
Accept-Encoding
access-control-allow-methods
GET,POST
content-type
application/x-javascript
access-control-allow-origin
*
access-control-max-age
86400
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
gpt.js
www.googletagservices.com/tag/js/
20 KB
8 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
dc87a2442d1fb08192d768befada253e79bb82af3d77c2827f260cba9ea0bf7f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"8 / 201 of 1000 / last-modified: 1536353385"
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
7849
x-xss-protection
1; mode=block
expires
Mon, 10 Sep 2018 14:28:37 GMT
bfa_infolayer_styles.css
a.bf-ad.net/packages/info-layer/chip/
1 KB
888 B
Stylesheet
General
Full URL
https://a.bf-ad.net/packages/info-layer/chip/bfa_infolayer_styles.css
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
a6a1913cb604f6626586e00b44f3d5a9efd6929752a59b87366d5f0ca70d39e4

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Fri, 13 Jul 2018 08:51:06 GMT
Server
Apache
ETag
"13446150d29adab64935a3c98d18ac19:1531471867"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
511
Expires
Mon, 10 Sep 2018 14:43:37 GMT
bfa_infolayer.js
a.bf-ad.net/packages/info-layer/chip/
6 KB
2 KB
Script
General
Full URL
https://a.bf-ad.net/packages/info-layer/chip/bfa_infolayer.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
98cab46844c5321e2681b64894ea3545cf9b80d86f41400ec60d015d57b02f06

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Fri, 13 Jul 2018 08:51:06 GMT
Server
Apache
ETag
"4691f031530ac829a2d7ca74911f8211:1531471867"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1986
Expires
Mon, 10 Sep 2018 14:43:37 GMT
config.js
cdn.conative.de/serve/domain/chip_de/
61 KB
8 KB
Script
General
Full URL
https://cdn.conative.de/serve/domain/chip_de/config.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.61 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-61.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
943e0dc9bd434fc272621a73673894ab9a32a4acc68a96809ed2da7585eee780

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 04:20:29 GMT
Content-Encoding
gzip
Last-Modified
Mon, 10 Sep 2018 02:35:19 GMT
Server
AmazonS3
Age
224
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 59c171b9abb6b3c58e72495c539dfa68.cloudfront.net (CloudFront)
Cache-Control
max-age=1800
Transfer-Encoding
chunked
x-amz-tagging-count
1
Connection
keep-alive
X-Amz-Cf-Id
cRwVtDcyzNYGZVAsAf8nfHEkXOn8SdcP9qIfCmzsKAX6idckbVYmYg==
default.js
ups.xplosion.de/loader/91628/
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.166.37 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-166-37.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
c927695a6166edbfb66984db84b2913dcc6da4c9af0c0072dfd3807e660cd5b6

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 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
/
partners.wfxtriggers.com/json/
231 B
385 B
Script
General
Full URL
https://partners.wfxtriggers.com/json/?resp_type=json&acctid=U87CFV&current=true&df=1,2,3&callback=jsonpCallback
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.52.41 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-52-41.eu-west-1.compute.amazonaws.com
Software
openresty/1.7.7.1 /
Resource Hash
8de1e71fbe6b18721745691e4bc988068868564fcc74de2e9cdb05402d9f20eb

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Server
openresty/1.7.7.1
Connection
keep-alive
Content-Length
231
Content-Type
text/plain
129347
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/129347?json=true&ts=7221752080697&t=permutive%3Dnull&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
22
Expires
Sun, 09 Sep 2018 14:28:37 GMT
cdb
bidder.criteo.com/
0
185 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=208&cb=8481717704815
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

Access-Control-Allow-Origin
https://www.chip.de
Date
Mon, 10 Sep 2018 14:28:37 GMT
Access-Control-Allow-Credentials
true
Server
Finatra
Vary
Origin
678257
ad.yieldlab.net/yp/
2 B
892 B
XHR
General
Full URL
https://ad.yieldlab.net/yp/678257?json=true&ts=2506151356363
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
22
Expires
Sun, 09 Sep 2018 14:28:37 GMT
910234
ad.yieldlab.net/yp/
2 B
892 B
XHR
General
Full URL
https://ad.yieldlab.net/yp/910234?json=true&ts=4554194130620
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
22
Expires
Sun, 09 Sep 2018 14:28:37 GMT
bid
d.nativendo.de/cds/rtb/
167 B
785 B
XHR
General
Full URL
https://d.nativendo.de/cds/rtb/bid?url=https://www.chip.de/downloads/Android-File-Transfer_53192185.html&format=burdaforward
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
be923a4db5597031f5e3189d0ceee2a71b4faddb7c20ed8ec90b6cbd80140a7b

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
access-control-allow-origin
https://www.chip.de
status
200
alt-svc
clear
content-length
143
pragma
no-cache
last-modified
Mon, 10 Sep 2018 14:28:37 GMT
server
Apache
vary
Accept-Encoding
access-control-allow-methods
POST, GET, OPTIONS
content-type
text/javascript; charset=utf8
via
1.1 google
cache-control
no-transform, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
access-control-allow-credentials
true
access-control-allow-headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
expires
Sat, 26 Jul 1997 05:00:00 GMT
auction
tlx.3lift.com/header/
19 B
769 B
XHR
General
Full URL
https://tlx.3lift.com/header/auction?inv_code=chip_right_rail&wrap=1&referrer=www.chip.de%2F%3F&size=300x250
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.185.168.60 Cambridge, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-185-168-60.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
0535c3bb3a17e4ac0fb7d29214d2181275662129dc2bdd2a89c35934e9fc5ba5
Security Headers
Name Value
X-Xss-Protection 0

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:37 GMT
x-auction-status
9
P3P
policyref="http://cdn.3lift.com/w3c/p3p.xml", CP="NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC"
access-control-allow-origin
https://www.chip.de
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
Connection
keep-alive
content-type
application/json; charset=utf-8
Content-Length
19
X-XSS-Protection
0
expires
Thu, 15 Oct 1992 20:10:00 GMT
placementbid.json
an.facebook.com/v2/
153 B
1 KB
XHR
General
Full URL
https://an.facebook.com/v2/placementbid.json?sdk=5.5.web&placementids[]=1934796273427415_1954754558098253&adformats[]=300x250
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a03:2880:f01c:800e:face:b00c:0:2 , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
/
Resource Hash
0b83e579e58877029429493de2f98c28025164977fd48f763789f6bbab6b4e2c
Security Headers
Name Value
Content-Security-Policy default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' *.atlassolutions.com blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* *.atlassolutions.com attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
Strict-Transport-Security max-age=15552000; preload
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

strict-transport-security
max-age=15552000; preload
content-encoding
gzip
x-fb-an-request-id
4672989906985465545
x-fb-an-errors
No user match (are cookies passed, and user logged in?)
status
200
x-xss-protection
0
pragma
no-cache
x-fb-debug
B0QfkH2aA749/rYpd947TneCSHNJC3BXbcYvxx8Y4btNovHmN4iHqsXJgV9WupYlGE7R4jDw/xOKELRf1wvaAg==
x-frame-options
DENY
date
Mon, 10 Sep 2018 14:28:37 GMT
expect-ct
max-age=86400, report-uri="http://reports.fb.com/expectct/"
vary
Accept-Encoding
content-type
text/javascript; charset=utf-8
access-control-allow-origin
https://www.chip.de
access-control-expose-headers
X-FB-AN-Request-ID, X-FB-AN-Errors, X-FB-AN-Bid-Count
cache-control
private, no-cache, no-store, must-revalidate
access-control-allow-credentials
true
content-security-policy
default-src * data: blob:;script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.virtualearth.net *.google.com 127.0.0.1:* *.spotilocal.com:* 'unsafe-inline' 'unsafe-eval' *.atlassolutions.com blob: data: 'self';style-src data: blob: 'unsafe-inline' *;connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net *.spotilocal.com:* wss://*.facebook.com:* https://fb.scanandcleanlocal.com:* *.atlassolutions.com attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;
x-content-type-options
nosniff
expires
Sat, 01 Jan 2000 00:00:00 GMT
ads
des.smartclip.net/
2 KB
1 KB
Script
General
Full URL
https://des.smartclip.net/ads?type=dyn&plc=92747&sz=400x320&ress=downloads&elementId=sc_dummy&ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&rnd=38116368
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.15.212 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-30-15-212.eu-west-1.compute.amazonaws.com
Software
nginx/1.13.12 /
Resource Hash
5048a2504c4315733dedf71143207a64faef50f62eea07f4d6fd1d9cdd1d99d7

Request headers

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

Response headers

Sc-Uuid
49dd650f-f543-4c51-862c-18eb86ce1396
Date
Mon, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Server
nginx/1.13.12
Vary
Accept-Encoding
P3P
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Sc-Devicetype
PC
Transfer-Encoding
chunked
Connection
keep-alive
Access-Control-Allow-Credentials
true
Content-Type
application/x-javascript; charset=utf-8
CHIP_Software_Deals_300x150.jpg
www.chip.de/download/assets/img/deals/
30 KB
30 KB
Image
General
Full URL
https://www.chip.de/download/assets/img/deals/CHIP_Software_Deals_300x150.jpg
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
1c86b047f9e6428cfbe4abc895303df8d2aad721d57136ec053476582d319226

Request headers

:path
/download/assets/img/deals/CHIP_Software_Deals_300x150.jpg
pragma
no-cache
cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1536676117431; oil_data={%22opt_in%22:true%2C%22timestamp%22:1536589717525%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}; chip_digital_session=1
accept-encoding
gzip, deflate
user-agent
Mozilla/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
cache-control
no-cache
:authority
www.chip.de
referer
https://www.chip.de/download/assets/download-v1.5.9.css
:scheme
https
:method
GET
Referer
https://www.chip.de/download/assets/download-v1.5.9.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
Mon, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Fri, 09 Mar 2018 09:05:27 GMT
server
nginx
vary
Accept-Encoding
content-type
image/jpeg
status
200
cache-control
public, max-age=26144088
accept-ranges
bytes
ssl
YES
content-length
30928
expires
Wed, 10 Jul 2019 04:43:25 GMT
truncated
/
305 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
323b3e828035a91dc4ebbdb9a38a2220d08404131f815649f83f2be870f40b60

Request headers

Response headers

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

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.chip.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:824::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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="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.chip.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:81e::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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
truncated
/
600 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
59eef289b63cafa1d3889e072a1cfefa5f7bf785b525eabcf3aef0002cb5533a

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
obtp.js
amplify.outbrain.com/cp/
4 KB
2 KB
Script
General
Full URL
https://amplify.outbrain.com/cp/obtp.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
26c9c2ffd3d4ea43b62a3ac326dc386049bf49048f038e051f684dee2e4d88ca

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Jun 2018 12:03:56 GMT
Server
Apache
ETag
"41f04bc9320bf2f0fe4cc3cbd05a460c:1528718636"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=1200
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1928
Expires
Mon, 10 Sep 2018 14:48:37 GMT
27574,90624,487835,487815,2355058,2456119
ad.yieldlab.net/yp/
490 B
2 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/27574,90624,487835,487815,2355058,2456119?json=true&ts=4526119894180&t=permutive%3Dnull&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
409b714f0c6bd1cc832bf33ac83011cafe1e12b03e8412172275d29cf515ec65

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
219
Expires
Sun, 09 Sep 2018 14:28:37 GMT
898200,910039,910040
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/898200,910039,910040?json=true&ts=6196209748288
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:37 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
22
Expires
Sun, 09 Sep 2018 14:28:37 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
710 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.197 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:39 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 302.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.69:80
AN-X-Request-Uuid
1d440a34-67bf-4176-86d2-47b6101fad93
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
pubads_impl_246.js
securepubads.g.doubleclick.net/gpt/
183 KB
63 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
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.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
694834f00526512ca65046c4b7519d2a100560cd871455f2246f0393ba567fcd
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 04 Sep 2018 15:46:36 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
64687
x-xss-protection
1; mode=block
expires
Mon, 10 Sep 2018 14:28:37 GMT
truncated
/
4 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
870e27cad33d8dc47d855e12048aad477184ca7d45b5b6812f70ffc2b34b1649

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
truncated
/
28 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
355ec6061c7818c5ac4e7d1d9cb56965255a632ba0d5fb49976d8c86024cc049

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/jpeg
adscript.min.js
cdn.conative.de/artifacts-v2/43c6f871a3c1f0d8b2e0b0441d77d17a47c6dc7a/
227 KB
64 KB
Script
General
Full URL
https://cdn.conative.de/artifacts-v2/43c6f871a3c1f0d8b2e0b0441d77d17a47c6dc7a/adscript.min.js
Requested by
Host: cdn.conative.de
URL: https://cdn.conative.de/serve/domain/chip_de/config.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.61 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-61.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
aa7b7560ae2a84c1b82ea3606755598e7e171d827634472fa54f75743327b3ae

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 31 Aug 2018 17:08:29 GMT
Content-Encoding
gzip
Last-Modified
Fri, 31 Aug 2018 17:06:40 GMT
Server
AmazonS3
Age
854409
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 59c171b9abb6b3c58e72495c539dfa68.cloudfront.net (CloudFront)
Cache-Control
public,max-age=31536000
Transfer-Encoding
chunked
Connection
keep-alive
X-Amz-Cf-Id
1OIJ-_vpHwb9rATSCZZnARRYPfy8S0wxNOPYQjWm2Jc4jfv-yB8POQ==
pixel
tr.outbrain.com/
43 B
167 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=002940522530083456
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.912438,VS0,VE96
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8138-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.38
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=002940522530083456
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
167 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=05477324005021862
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.912841,VS0,VE104
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8122-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.22
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=05477324005021862
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
158 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=001108795499103632
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.912411,VS0,VE93
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8142-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.42
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=001108795499103632
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
158 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=09757537250812369
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.912446,VS0,VE99
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8147-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.47
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=09757537250812369
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
321 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=0030514471363813467
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.912849,VS0,VE91
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8133-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.33
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=0030514471363813467
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
158 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=020326163457171842
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.003108,VS0,VE101
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8127-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.27
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=020326163457171842
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
135 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=041442683307506134
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.064184,VS0,VE104
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8122-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.22
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=041442683307506134
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
116 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=0979531739685074
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.134.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, MAD, Europe1
x-timer
S1536589718.064689,VS0,VE91
date
Mon, 10 Sep 2018 14:28:38 GMT
x-served-by
cache-jfk8133-JFK, cache-mad9431-MAD
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.33
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&bust=0979531739685074
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
/
dco.smartclip.net/
353 KB
108 KB
Script
General
Full URL
https://dco.smartclip.net/?plc=92747
Requested by
Host: des.smartclip.net
URL: https://des.smartclip.net/ads?type=dyn&plc=92747&sz=400x320&ress=downloads&elementId=sc_dummy&ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&rnd=38116368
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2047:fe00:9:e42d:cc80:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.12.2 / PHP/7.1.11
Resource Hash
62763330432501cee46b4603a4321372108b05fbc083850bed4585f99739cf90

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 11:32:20 GMT
content-encoding
gzip
server
nginx/1.12.2
age
10578
status
200
x-powered-by
PHP/7.1.11
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/x-javascript
access-control-allow-origin
*
x-amz-cf-id
12RMQfwn2A6TLPK7w3cYFnWtyXsQBo85ZTrwQftkNGQa7YpRddyQow==
via
1.1 ec6662ba477736a13086dd664a1145be.cloudfront.net (CloudFront)
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/91628/default.js?xplrdir=1
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2047:ca00: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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
25454662
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
0lehvQyyJEjlzQtUa1VNOj3R9B8z_Ycz7hSGvS1JXjawE3YMCdfsyQ==
via
1.1 67284fcf464f6f1529cc1e521669622c.cloudfront.net (CloudFront)
MarselisSlabWeb.woff2
www.chip.de/fec/assets/font/
27 KB
27 KB
Font
General
Full URL
https://www.chip.de/fec/assets/font/MarselisSlabWeb.woff2
Requested by
Host: www.chip.de
URL: https://www.chip.de/download/assets/hook-v1.5.9.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
92a1b0df334580a9784edb23c8b77fb0d9d617122cd953c4dc3c8c32b29d9f75

Request headers

:path
/fec/assets/font/MarselisSlabWeb.woff2
pragma
no-cache
cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1536676117431; oil_data={%22opt_in%22:true%2C%22timestamp%22:1536589717525%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}; chip_digital_session=1; tfm_uid=Opo9UIvNFs1XGERHQOc5BgwMAhy3rKp7
origin
https://www.chip.de
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
www.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Wed, 13 Jun 2018 11:41:12 GMT
server
nginx
status
200
vary
Accept-Encoding
content-type
application/font-woff2
access-control-allow-origin
*
cache-control
public, max-age=408
accept-ranges
bytes
ssl
YES
content-length
27813
expires
Mon, 10 Sep 2018 14:35:25 GMT
3837cbf51f30a08c.jpg
www.chip.de/ii/1/3/7/2/5/9/0/7/
37 KB
32 KB
Image
General
Full URL
https://www.chip.de/ii/1/3/7/2/5/9/0/7/3837cbf51f30a08c.jpg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
b015b0cf826bfaa0ead29ba2dcaa3d7b32f802257b192d9518ab86ca836b5a38

Request headers

:path
/ii/1/3/7/2/5/9/0/7/3837cbf51f30a08c.jpg
pragma
no-cache
cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1536676117431; oil_data={%22opt_in%22:true%2C%22timestamp%22:1536589717525%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}; chip_digital_session=1; tfm_uid=Opo9UIvNFs1XGERHQOc5BgwMAhy3rKp7; CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964
accept-encoding
gzip, deflate
user-agent
Mozilla/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
cache-control
no-cache
:authority
www.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
content-encoding
gzip
last-modified
Wed, 07 Mar 2018 15:37:58 GMT
server
nginx
vary
Accept-Encoding
content-type
image/jpeg
status
200
cache-control
public, max-age=15383838
accept-ranges
bytes
ssl
YES
content-length
32446
expires
Thu, 07 Mar 2019 15:45:56 GMT
satellite-5a1fc54664746d108e0025fa.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
1 KB
823 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a1fc54664746d108e0025fa.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
9ce0815e04e67d2dde584322db795c23301b0794797fbcd84210d49bc89ad28a

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a1fc54664746d108e0025fa.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 12:29:27 GMT
server
AkamaiNetStorage
etag
"1bbd204641533bb6cd622e5d702269da:1536150567.867984"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=152
accept-ranges
bytes
timing-allow-origin
*
content-length
578
expires
Mon, 10 Sep 2018 14:31:09 GMT
satellite-57ad808c64746d3e8d000ef0.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
12 KB
4 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57ad808c64746d3e8d000ef0.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
2ac0bda221cfdc311f691f5b9fa2729efdfdb485f16e54f8089c3fc3ef50d354

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57ad808c64746d3e8d000ef0.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 12:29:25 GMT
server
AkamaiNetStorage
etag
"5e1418055bacf3067ad47441e9bbbf43:1536150565.490841"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=240
accept-ranges
bytes
timing-allow-origin
*
content-length
3573
expires
Mon, 10 Sep 2018 14:32:37 GMT
satellite-5b6c0da664746d2bdc0043ab.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
1 KB
947 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b6c0da664746d2bdc0043ab.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
a92618a39ca0b874fe2c10608c9ccb1da20fe96cdd6ba1bee086179e3743dc22

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b6c0da664746d2bdc0043ab.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 12:29:24 GMT
server
AkamaiNetStorage
etag
"0808ee9a4fae157c2a5006ba2acd7dde:1536150564.293798"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=129
accept-ranges
bytes
timing-allow-origin
*
content-length
703
expires
Mon, 10 Sep 2018 14:30:46 GMT
s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/
35 KB
13 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
13d01a91a2551b2330cd623855b2adcda9f371d720eb02ef3adcf3a5dbffcf6a

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 12:29:22 GMT
server
AkamaiNetStorage
etag
"02ca1a570d3d888e83ac86b30c9aeb8d:1536150562.004663"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=110
accept-ranges
bytes
timing-allow-origin
*
content-length
13386
expires
Mon, 10 Sep 2018 14:30:27 GMT
satellite-58b3dec264746d7415009f7b.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
97 B
376 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-58b3dec264746d7415009f7b.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
96462e773b00c01a79cd885a78e923ea67fe8765c6d1ba38410133b222b34c71

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-58b3dec264746d7415009f7b.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 GMT
content-encoding
gzip
last-modified
Mon, 10 Sep 2018 06:52:24 GMT
server
AkamaiNetStorage
etag
"f9e6fb38072864f7c23cb0a6b27cc98f:1536562344.81255"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=35
accept-ranges
bytes
timing-allow-origin
* *
content-length
115
expires
Mon, 10 Sep 2018 14:29:12 GMT
front.asp
k.intellitxt.com/intellitxt/
2 KB
1 KB
Script
General
Full URL
https://k.intellitxt.com/intellitxt/front.asp?ipid=5154
Requested by
Host: ad-js.chip.de
URL: https://ad-js.chip.de/js/chip/9232.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
3c46f11abb9fedf9ac6759180dfd4f443efa54aad2ca0b73efbb7e1b59aa750a

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
Server
nginx
X-Powered-By
Kormorant
Vary
Accept-Encoding, *
Content-Type
application/javascript; charset=utf-8
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Fri, 08 Jan 2016 00:00:00 GMT
collect
rt.chip.de/
35 B
391 B
Image
General
Full URL
https://rt.chip.de/collect?t=live.track&cachebust=jlwduefq&rnd=2acc3312-7820-487c-8965-56cd4436c5ab&ran=2acc3312-7820-487c-8965-56cd4436c5ab&14=7350&uid=0.28632896932745&ref=&url=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&tit=android%20file%20transfer&id=13725907&bart=Downloads_Updates&layout=c1_downloads&ch=downloads&sch=macos&ssch=n%2Fa&ivw=downloads&mob=stationaer&aut=michael%20humpa&can=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.137.113.194 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-46-137-113-194.eu-west-1.compute.amazonaws.com
Software
nginx/1.7.9 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
rt.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
Last-Modified
Sun, 17 May 1998 03:00:00 GMT
Server
nginx/1.7.9
Content-Type
image/gif
Cache-Control
private, no-cache, no-cache=Set-Cookie, proxy-revalidate
Connection
keep-alive
Content-Length
35
Expires
Mon, 07 Aug 1995 23:30:00 GMT
DG6LL-C2K3J-45PG2-VMF2Q-KM6V9
s.go-mpulse.net/boomerang/ Frame 45EF
187 KB
55 KB
Script
General
Full URL
https://s.go-mpulse.net/boomerang/DG6LL-C2K3J-45PG2-VMF2Q-KM6V9
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b6c0da664746d2bdc0043ab.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
104.108.48.32 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-108-48-32.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e0b8436d50fb200de76d7a25cf450ea238cd100197f8e9d462e9228153da873f

Request headers

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

Response headers

status
200
date
Mon, 10 Sep 2018 14:28:38 GMT
content-encoding
gzip
cache-control
max-age=604800
timing-allow-origin
*
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
Cookie set s68700513460966
somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/
Redirect Chain
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s68700513460966?AQB=1&ndh=1&pf=1&t=10%2F8%2F2018%2014%3A28%3A37%201%200&D=D%3D&fid=4C84469BB7195702-079F35F47EAAC35F&ce=UTF-8&pageName=...
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s68700513460966?AQB=1&pccr=true&vidn=2DCB3FCB053131F8-6000010DE0000391&&ndh=1&pf=1&t=10%2F8%2F2018%2014%3A28%3A37%201%200&D=D%3D&fid=4C...
43 B
742 B
Image
General
Full URL
https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s68700513460966?AQB=1&pccr=true&vidn=2DCB3FCB053131F8-6000010DE0000391&&ndh=1&pf=1&t=10%2F8%2F2018%2014%3A28%3A37%201%200&D=D%3D&fid=4C84469BB7195702-079F35F47EAAC35F&ce=UTF-8&pageName=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&ch=downloads&server=www.chip.de&events=event154%3D7&c1=D%3Dv7&v2=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&c3=D%3Dv15&v3=First%20Visit&v4=Weekday%7CMonday%7C4%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=macos&c8=c1_downloads&v8=n%2Fa&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.android.com&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c37=michael%20humpa&c38=visible&c40=n%2Fa&v42=mac%20und%20android%3A%20android%20file%20transfer&v43=7&c44=dtm%20CHIP%20Master&c46=chip_digital%7Cdownloads%7Cmacos%7Cartikel%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=13725907&v60=1_fm6che7o&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
63.140.40.124 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
chip.de.ssl.sc.omtrdc.net
Software
Omniture DC/2.0.0 /
Resource Hash
a1ecbaed793a1f564c49c671f2dd0ce36f858534ef6d26b55783a06b884cc506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
somniture.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964; s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.4.0
P3P
CP="This is not a P3P policy"
Connection
Keep-Alive
Content-Length
43
X-XSS-Protection
1; mode=block
Pragma
no-cache
Last-Modified
Tue, 11 Sep 2018 14:28:38 GMT
Server
Omniture DC/2.0.0
xserver
www248
ETag
"3299801293177028608-5127877204063031622"
Vary
*
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Set-Cookie
s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]; Expires=Wed, 9 Sep 2020 14:28:38 GMT; Domain=chip.de; Path=/
Keep-Alive
timeout=15
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.4.0
P3P
CP="This is not a P3P policy"
Connection
Keep-Alive
Content-Length
0
X-XSS-Protection
1; mode=block
Pragma
no-cache
Last-Modified
Tue, 11 Sep 2018 14:28:38 GMT
Server
Omniture DC/2.0.0
xserver
www111
Location
https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s68700513460966?AQB=1&pccr=true&vidn=2DCB3FCB053131F8-6000010DE0000391&&ndh=1&pf=1&t=10%2F8%2F2018%2014%3A28%3A37%201%200&D=D%3D&fid=4C84469BB7195702-079F35F47EAAC35F&ce=UTF-8&pageName=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&ch=downloads&server=www.chip.de&events=event154%3D7&c1=D%3Dv7&v2=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&c3=D%3Dv15&v3=First%20Visit&v4=Weekday%7CMonday%7C4%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=macos&c8=c1_downloads&v8=n%2Fa&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.android.com&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c37=michael%20humpa&c38=visible&c40=n%2Fa&v42=mac%20und%20android%3A%20android%20file%20transfer&v43=7&c44=dtm%20CHIP%20Master&c46=chip_digital%7Cdownloads%7Cmacos%7Cartikel%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=13725907&v60=1_fm6che7o&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Content-Type
text/plain
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Set-Cookie
s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]; Expires=Wed, 9 Sep 2020 14:28:38 GMT; Domain=chip.de; Path=/
Keep-Alive
timeout=15
Expires
Sun, 09 Sep 2018 14:28:38 GMT
global_config.json
hgc-cf-cache-1.svonm.com/
53 B
718 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/global_config.json
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.73 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-73.fra53.r.cloudfront.net
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 04:42:28 GMT
Via
1.1 ed0c487879f809919537bf00a2f2dc8f.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
53
Last-Modified
Mon, 10 Sep 2018 04:42:03 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
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
a1QO50Fp1hjN8m4-wFG8H5eSHXKRS4Dxdo9bx1CJP3Hu0i62aBShXg==
Expires
0
homadConfig.json
filestorage.chip.de/videoplayer//config/
323 B
677 B
XHR
General
Full URL
https://filestorage.chip.de/videoplayer//config/homadConfig.json
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a

Request headers

Pragma
no-cache
Origin
https://www.chip.de
Accept-Encoding
gzip, deflate
Host
filestorage.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 06 Sep 2018 12:02:18 GMT
Server
Apache
ETag
"bdd1fe062d58c3e9d9216922f317755d:1536235338"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
*
Content-Length
183
27572
ad.yieldlab.net/yp/
171 B
2 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/27572?json=true&ts=7473556348344&t=permutive%3Dnull&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
c5db83fccd1ba5f75cb3c453eb4c09e0f73f79e0337edd7107441f5e9798dc0d

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
148
Expires
Sun, 09 Sep 2018 14:28:38 GMT
898206
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/898206?json=true&ts=4095229249437
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
22
Expires
Sun, 09 Sep 2018 14:28:38 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
711 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.197 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:40 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 302.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.222.238:80
AN-X-Request-Uuid
fafc7e9a-100b-4825-b74d-106b8ac547fc
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
7 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1144401803364650&correlator=545247416422495&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&json_a=1&eid=22334400%2C21061459&vrg=246&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu_parts=3673%2Cchip_digital%2Cdownloads%2Cmacos%2Cartikel&enc_prev_ius=%2F0%2F1%2F2%2F3%2F4&prev_iu_szs=728x90%7C800x250%7C970x250%7C970x90&prev_scp=tfs_usr%3D1%26tile%3D1%26site%3Dchip_digital%26res%3Ddownloads%26rub%3Dmacos%26lay%3Dc1_downloads%26tgrp%3D3%26aem%3Dinf%26skv%3D1%26tfww%3D78910111213141516%26tfwiw%3D1600%26tfwih%3D1200%26kw%3Dnone%26pid%3D13725907%26uid%3DOpo9UIvNFs1XGERHQOc5BgwMAhy3rKp7%26wfxtg%3D842%2C848%2C854%2C876%2C877%2C878%2C959%2C960%26wfxtg_0%3D842%2C843%2C848%2C877%2C878%2C959%2C960%26wfxtg_1%3D842%2C843%2C844%2C846%2C848%2C878%2C959%2C960%26wfxtg_2%3D844%2C846%2C878%26hb_f%3Dwbb%26hb_p%3D82%26hb_c%3D2355058%26hb_v%3Dyieldlab%26hb_id%3DFR18M3yQfmRDkXUi%26pos%3Ddban1%26rl_seq%3D1%26sm%3Dd%2Ct1%2Cr0%2Cdis%2Cdis1%2Ch%2Csticky%2Cd_h%2Ch1%26cimp%3D1%26consent%3DBOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_chip_digital%252Cc_pan%252C%2520c_exp%252Cc_desktop%252Cc_sbb%252Cc_smc21%252Cc_si%252Cc_mgpt&eri=5&cookie_enabled=1&bc=7&abxe=1&lmt=1536589718&dt=1536589718120&dlt=1536589717289&idt=802&frm=20&biw=1585&bih=1200&oid=3&adxs=429&adys=62&adks=1162233392&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.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&dssz=80&icsg=140917876981775&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x90&msz=1000x90&ga_vid=1952892213.1536589718&ga_sid=1536589718&ga_hid=169438138&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
389d9ac2a9b303896c087649ef7758e2ec40acfedd1078a2216a8fd73df83bab
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:38 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
3270
x-xss-protection
1; mode=block
google-lineitem-id
4397695872
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138209116492
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.chip.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_246.js
securepubads.g.doubleclick.net/gpt/
45 KB
17 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_246.js?cb=243
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
sffe /
Resource Hash
66a7f220521242ab44a0f1cb8cbb4ec4422abeb057a0d1510a0a3f3ff60fb91b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Tue, 04 Sep 2018 15:46:36 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
17260
x-xss-protection
1; mode=block
expires
Mon, 10 Sep 2018 14:28:38 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

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

Response headers

expires
Thu, 05 Sep 2019 20:44:38 GMT
cache-control
public, immutable, max-age=31536000
last-modified
Mon, 11 Jun 2018 14:38:59 GMT
content-type
text/html
config.json
hgc-cf-cache-1.svonm.com/www.chip.de/
422 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.chip.de/config.json
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.73 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-73.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Tue, 07 Aug 2018 07:40:57 GMT
Via
1.1 ed0c487879f809919537bf00a2f2dc8f.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
52
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
422
Last-Modified
Tue, 07 Aug 2018 07:40:10 GMT
Server
AmazonS3
ETag
"2f988edff393a29c96e2df9109950ab1"
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
jnuQLqDyQf07CiHmvZe6Bd2mGdZcy-NVpBOK1uOje6y8UTxE8ZNMCA==
Expires
0
1_fm6che7o
videoembed.chip.de/v3/videos/
1 KB
1 KB
Fetch
General
Full URL
https://videoembed.chip.de/v3/videos/1_fm6che7o
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
02fc09402ed0eacc82a0775185d88a5c55926568767dcec0038a63da5b175cf3

Request headers

Pragma
no-cache
Origin
https://www.chip.de
Accept-Encoding
gzip, deflate
Host
videoembed.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
X-Server-Version
6.15.8
Server
nginx
Access-Control-Allow-Origin
*
SSL
YES
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
X-FE-Version
1.22.0
Cache-Control
public, max-age=0
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-fancyBox
Content-Length
612
Expires
Mon, 10 Sep 2018 14:28:38 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/
188 KB
52 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=kJjzsAyJgG
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.73 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-73.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
d40b5f84c921f3c3075d01ec5cebcaeea07068ed43f0ff9204381eb1e575f085

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 13:09:49 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
11
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Mon, 10 Sep 2018 13:09:34 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 ed0c487879f809919537bf00a2f2dc8f.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
T0IW5xEJGluzCdgGeZcJxDQjdryZivv5Om1BTRIfSGCn3W0w9wMtrg==
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Android%20File%20Transfer%20-%20Download%20-%20CHIP&hostSiteUrl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&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=91628&_ver=0.1.13&_seg=jsonp&_=555493803804
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.18.166.37 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-166-37.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
525fd4bda968296354c5e6655e25a275c18146bbaf360ee1b5c1db729c94c8b6

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:37 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
1507
/
k.intellitxt.com/go/1/
4 KB
2 KB
Script
General
Full URL
https://k.intellitxt.com/go/1/?ipid=5154&consentstr={%22opt_in%22:true%2C%22timestamp%22:1536589717525%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}&consenttype=oil_data
Requested by
Host: k.intellitxt.com
URL: https://k.intellitxt.com/intellitxt/front.asp?ipid=5154
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
967fc73388397671e36cab8d0d1083058881d67d7a63be24041e492628309974

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
Server
nginx
X-Powered-By
Kormorant
Vary
Accept-Encoding, *
Content-Type
text/javascript; charset=utf-8
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Fri, 08 Jan 2016 00:00:00 GMT
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: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:818::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
aee550e3ea4a294b63c1da465eb0f814a806dc5b8e2ec76c0129ef72884b356f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 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
81220
x-xss-protection
1; mode=block
expires
Mon, 10 Sep 2018 14:28:38 GMT
ads
securepubads.g.doubleclick.net/gampad/
5 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1144401803364650&correlator=545247416422495&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fifs&adsid=NT&json_a=1&eid=22334400%2C21061459&vrg=246&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu_parts=3673%2Cchip_digital%2Cdownloads%2Cmacos%2Cartikel&enc_prev_ius=%2F0%2F1%2F2%2F3%2F4&prev_iu_szs=160x600%7C350x600&prev_scp=tfs_usr%3D1%26tile%3D2%26site%3Dchip_digital%26res%3Ddownloads%26rub%3Dmacos%26lay%3Dc1_downloads%26tgrp%3D3%26aem%3Dinf%26skv%3D1%26tfww%3D78910111213141516%26tfwiw%3D1600%26tfwih%3D1200%26kw%3Dnone%26pid%3D13725907%26uid%3DOpo9UIvNFs1XGERHQOc5BgwMAhy3rKp7%26wfxtg%3D842%2C848%2C854%2C876%2C877%2C878%2C959%2C960%26wfxtg_0%3D842%2C843%2C848%2C877%2C878%2C959%2C960%26wfxtg_1%3D842%2C843%2C844%2C846%2C848%2C878%2C959%2C960%26wfxtg_2%3D844%2C846%2C878%26hb_f%3Dsky%26hb_p%3D18%26hb_c%3D27572%26hb_v%3Dyieldlab%26hb_id%3DAzvkPnQW59elcDIz%26pos%3Ddsky1%26rl_seq%3D1%26sm%3Dd%2Ct2%2Cr0%2Cdis%2Cnat%2Cdis2%2Cnat1%2Coop%2Cd_oop%2Coop1%26cimp%3D1%26consent%3DBOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_chip_digital%252Cc_pan%252C%2520c_exp%252Cc_desktop%252Cc_sbb%252Cc_smc21%252Cc_si%252Cc_mgpt&eri=5&cookie_enabled=1&bc=7&abxe=1&lmt=1536589718&dt=1536589718200&dlt=1536589717289&idt=802&frm=20&biw=1585&bih=1200&oid=3&adxs=1305&adys=162&adks=542669646&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.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&dssz=83&icsg=2254686031708175&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=640x0&msz=160x600&ga_vid=1952892213.1536589718&ga_sid=1536589718&ga_hid=169438138&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
f7505e6aa0b337a6b561ea835262b6a45bb36848e971a6122b00bf9172f9b51c
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:38 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
2460
x-xss-protection
1; mode=block
google-lineitem-id
4382706687
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138208081151
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.chip.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
27573,90623,5197809
ad.yieldlab.net/yp/
159 B
2 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/27573,90623,5197809?json=true&ts=5380759239021&t=none%26permutive%3Dnull&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
bbbfc98b4c2571bf9507e45e3e237b9e24b880748900027aed5e421f8a6fa4bc

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
144
Expires
Sun, 09 Sep 2018 14:28:38 GMT
898203,910037
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/898203,910037?json=true&ts=1990235206536
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
22
Expires
Sun, 09 Sep 2018 14:28:38 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
711 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.197 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:40 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 302.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.118:80
AN-X-Request-Uuid
894a9410-0b8f-46e6-946a-433e38dcec34
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
prebid
ib.adnxs.com/ut/v3/
21 B
711 B
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.197 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:40 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 302.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.229:80
AN-X-Request-Uuid
b431615b-bf5f-4f66-8d3d-b902dd8a18b9
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
21
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
truncated
/
188 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d40b5f84c921f3c3075d01ec5cebcaeea07068ed43f0ff9204381eb1e575f085

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/javascript
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.72.140.158 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-72-140-158.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 06:07:51 GMT
Content-Encoding
gzip
Last-Modified
Mon, 10 Sep 2018 06:07:37 GMT
Server
akka-http/10.1.3
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
471 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=23666&ext_id=BSasWDa3ESR-EiUZWsf-BiUABifkBS7-WDfABifABifABfrr&ddata_seg=e0
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
85.114.144.199 , 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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 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
Sun, 09 Sep 2018 14:28:38 GMT
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=6599602586195195927
3 B
466 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6599602586195195927
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2001:16e0:10a:1::c1:1 , Germany, ASN12611 (RKOM R-KOM Regensburger Telekommunikations GmbH & Co. KG, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:27:11 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=6599602586195195927
Date
Mon, 10 Sep 2018 14:28:38 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
xpl.theadex.com/d/327/i/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasWDa3ESR-EiUZWsf-BiUABifkBS7-WDfABifABifABfrr
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000118281628380079&axd_pid=22&axd_fuid=BSasWDa3ESR-EiUZWsf-BiUABifkBS7-WDfABifABifABfrr
43 B
717 B
Image
General
Full URL
https://xpl.theadex.com/d/327/i/2.gif?_sc=1000118281628380079&axd_pid=22&axd_fuid=BSasWDa3ESR-EiUZWsf-BiUABifkBS7-WDfABifABifABfrr
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
85.114.144.106 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
Last-Modified
Mon, 10 Sep 2018 14:28:38 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
Mon, 10 Sep 2018 14:28:38 GMT
Server
nginx
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"
Location
https://xpl.theadex.com:443/d/327/i/2.gif?_sc=1000118281628380079&axd_pid=22&axd_fuid=BSasWDa3ESR-EiUZWsf-BiUABifkBS7-WDfABifABifABfrr
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=UTF-8
rc
smartclip.nuggad.net/
349 B
1 KB
XHR
General
Full URL
https://smartclip.nuggad.net/rc?nuggn=35854137&nuggsid=474493238&notrack=false
Requested by
Host: des.smartclip.net
URL: https://des.smartclip.net/ads?type=dyn&plc=92747&sz=400x320&ress=downloads&elementId=sc_dummy&ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&rnd=38116368
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
2a00:cd0:1005:2:80:82:201:80 , Germany, ASN48173 (UNBELIEVABLE-AS, DE),
Reverse DNS
Software
Apache /
Resource Hash
fea76a36651a6a153f98259cd2f9b1d1da70b2c4bbccf38c3bd0606d6d35f768

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
P3P
CP="NOI DSP COR NID ADMa OTPa OUR NOR"
Status
200 OK
Connection
Keep-Alive
Content-Length
225
Access-Control-Allow-Headers
Accept
Server
Apache
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/javascript
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache
Access-Control-Allow-Credentials
true
Keep-Alive
timeout=5, max=76
Expires
Wed, 18 Feb 2009 11:53:30 GMT
kormorant-1.28.06.min.js
images.intellitxt.com/k/
170 KB
48 KB
Script
General
Full URL
https://images.intellitxt.com/k/kormorant-1.28.06.min.js
Requested by
Host: k.intellitxt.com
URL: https://k.intellitxt.com/go/1/?ipid=5154&consentstr={%22opt_in%22:true%2C%22timestamp%22:1536589717525%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}&consenttype=oil_data
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.126 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-126.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
97f4a90cf712c7ba9c33bfa1684ca989731e94549bce7cd07d00d8bf5ead4e93

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 05 Sep 2018 08:07:57 GMT
content-encoding
gzip
last-modified
Tue, 04 Sep 2018 15:50:24 GMT
server
AmazonS3
age
454842
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-id
nErYGs-QR1Hu69_5tgenl6VBl4ZzVlUeMlzULYiPWqh7GAyjrW-DRg==
via
1.1 23082ff4de65f70078e091bc7cd0cf24.cloudfront.net (CloudFront)
Cookie set s63722814821519
somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/
43 B
741 B
Image
General
Full URL
https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s63722814821519?AQB=1&ndh=1&pf=1&t=10%2F8%2F2018%2014%3A28%3A37%201%200&D=D%3D&fid=4C84469BB7195702-079F35F47EAAC35F&ce=UTF-8&pageName=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&ch=downloads&server=www.chip.de&events=event168&v2=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D&v6=downloads&v15=Downloads_Updates&v30=c1_downloads&c44=dtm%20CHIP%20Master&v66=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&v67=13725907&v70=downloads&pe=lnk_o&pev2=oil_shown&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
63.140.40.124 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
chip.de.ssl.sc.omtrdc.net
Software
Omniture DC/2.0.0 /
Resource Hash
a1ecbaed793a1f564c49c671f2dd0ce36f858534ef6d26b55783a06b884cc506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
somniture.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964; s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.4.0
P3P
CP="This is not a P3P policy"
Connection
Keep-Alive
Content-Length
43
X-XSS-Protection
1; mode=block
Pragma
no-cache
Last-Modified
Tue, 11 Sep 2018 14:28:38 GMT
Server
Omniture DC/2.0.0
xserver
www31
ETag
"3299801293177028608-5395946788442080297"
Vary
*
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Set-Cookie
s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]; Expires=Wed, 9 Sep 2020 14:28:38 GMT; Domain=chip.de; Path=/
Keep-Alive
timeout=15
Expires
Sun, 09 Sep 2018 14:28:38 GMT
100
videos.chip.de/p/1741931/sp/174193100/thumbnail/entry_id/1_fm6che7o/version/100011/acv/111/width/100/vid_slices/
118 KB
118 KB
Image
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/thumbnail/entry_id/1_fm6che7o/version/100011/acv/111/width/100/vid_slices/100
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
0ce06e90ff45dee22ede838c2cb6e3d185fc5aaa45206f15dfe1acaf9775e7e8

Request headers

:path
/p/1741931/sp/174193100/thumbnail/entry_id/1_fm6che7o/version/100011/acv/111/width/100/vid_slices/100
pragma
no-cache
cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964; s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]
accept-encoding
gzip, deflate
user-agent
Mozilla/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
cache-control
no-cache
:authority
videos.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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-kaltura
cached-thumb-exists,2a68aad86ac627a005f16666050467e3
x-me
ny-front-thumb7
date
Mon, 10 Sep 2018 14:28:38 GMT
x-vod-session
1579093
status
200
x-kaltura-session
2128650647
content-length
120606
pragma
last-modified
Wed, 07 Mar 2018 16:18:34 GMT
server
nginx
vary
Accept-Encoding
x-vod-me
ny-front-vod15
content-type
image/jpeg
access-control-allow-origin
*
cache-control
public, max-age=3600
accept-ranges
bytes
expires
Mon, 10 Sep 2018 15:28:38 GMT
ads
securepubads.g.doubleclick.net/gampad/
17 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1144401803364650&correlator=545247416422495&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fifs&adsid=NT&json_a=1&eid=22334400%2C21061459&vrg=246&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu_parts=3673%2Cchip_digital%2Cdownloads%2Cmacos%2Cartikel&enc_prev_ius=%2F0%2F1%2F2%2F3%2F4&prev_iu_szs=320x50%7C300x600%7C300x180%7C300x250%7C99x99%7C1x6&fluid=height&prev_scp=tfs_usr%3D1%26tile%3D3%26site%3Dchip_digital%26res%3Ddownloads%26rub%3Dmacos%26lay%3Dc1_downloads%26tgrp%3D3%26aem%3Dinf%26skv%3D1%26tfww%3D78910111213141516%26tfwiw%3D1600%26tfwih%3D1200%26kw%3Dnone%26pid%3D13725907%26uid%3DOpo9UIvNFs1XGERHQOc5BgwMAhy3rKp7%26wfxtg%3D842%2C848%2C854%2C876%2C877%2C878%2C959%2C960%26wfxtg_0%3D842%2C843%2C848%2C877%2C878%2C959%2C960%26wfxtg_1%3D842%2C843%2C844%2C846%2C848%2C878%2C959%2C960%26wfxtg_2%3D844%2C846%2C878%26hb_f%3Dmr%26hb_p%3D16%26hb_c%3D27573%26hb_v%3Dyieldlab%26hb_id%3DlOYIPWlafxK1WiMq%26emqrtt%3Dnone%26sasdb%3Db7ff4ba6-c2d1-4de2-864b-496c8b1cf1cc%26sasdbr%3Dg%26pos%3Ddmr1%26rl_seq%3D1%26sm%3Dd%2Ct3%2Cr0%2Cdis%2Cnat%2Cdis3%2Cnat2%2Cv%2Cq%2Cd_v%2Cv1%2Cq1%26cimp%3D1%26consent%3DBOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_chip_digital%252Cc_pan%252C%2520c_exp%252Cc_desktop%252Cc_sbb%252Cc_smc21%252Cc_si%252Cc_mgpt%252Cc_mhpa&eri=5&cookie_enabled=1&bc=7&abxe=1&lmt=1536589718&dt=1536589718437&dlt=1536589717289&idt=802&frm=20&biw=1585&bih=1200&oid=3&adxs=963&adys=194&adks=685963231&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.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&dssz=92&icsg=11544872091663&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=319x33&msz=299x-1&ga_vid=1952892213.1536589718&ga_sid=1536589718&ga_hid=169438138&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
86f0604b3e2f0617e88f739b6cfc368ace4a520e3f4044e1b22394f49abb28eb
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:38 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
4945
x-xss-protection
1; mode=block
google-lineitem-id
4550829480
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138243646987
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.chip.de
access-control-expose-headers
x-google-amp-ad-validated-version
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
90795
ad.yieldlab.net/yp/
159 B
2 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/90795?json=true&ts=219273898597&t=e0%2Ceuu%26permutive%3Dnull&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
af331e1a65a2d58fa6a41a12789e98d9a8236e972ff2d2719e5f64466fd3feb5

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET
Content-Language
de-DE
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=UTF-8
Access-Control-Allow-Headers
Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Mx-ReqToken,X-Requested-With
Content-Length
144
Expires
Sun, 09 Sep 2018 14:28:38 GMT
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
bridge3.234.1_en.html
imasdk.googleapis.com/js/core/ Frame A260
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.234.1_en.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:818::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.234.1_en.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.chip.de/downloads/Android-File-Transfer_53192185.html
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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
165768
date
Sat, 01 Sep 2018 16:10:19 GMT
expires
Sun, 01 Sep 2019 16:10:19 GMT
last-modified
Sat, 01 Sep 2018 16:07:59 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
771499
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
client.js
s0.2mdn.net/instream/video/
26 KB
11 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 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
Mon, 10 Sep 2018 14:28:38 GMT
970x250
ad.yieldlab.net/d/2355058/21691/ Frame 740A
774 B
1 KB
Script
General
Full URL
https://ad.yieldlab.net/d/2355058/21691/970x250?ts=1536589718030&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
e37a88100825cf11e2592364c1fe83dfd2e28c04eb0766d2c04ce77027a771e9

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 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
416
Expires
Sun, 09 Sep 2018 14:28:38 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180904/r20110914/activeview/ Frame 740A
73 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180904/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d9262cbf7f04dd3b4ba9b73a11cbd614a1e707f22317611aac9d294b20a85103
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 04 Sep 2018 18:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
502472
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
27233
x-xss-protection
1; mode=block
server
cafe
etag
12076525581148098716
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 18 Sep 2018 18:54:06 GMT
osd.js
pagead2.googlesyndication.com/pagead/
73 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_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:824::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
2c58d4161a717be7779fc054c22883c300eb12b7556628c849c33aa104ee8ed6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 13:39:01 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
2977
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
27104
x-xss-protection
1; mode=block
server
cafe
etag
16306743829198919951
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=3600
timing-allow-origin
*
expires
Mon, 10 Sep 2018 14:39:01 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 740A
0
269 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst98s39dtvjUlszpytOVw-JZaMWZgWOOjATUTZlckeWHuoao3CdYzO0EnMw8o5CMAk_FiQDFkihlM5anbaGCcy-wS3wW0FHRoGhRqKBhefIamHaDdRTCDiuFbW53Xm_Rz2R-Hx9iCE9GhvZR9MSmxCM7Y89Qn2Zv2QcDToR99bXHNtDogxdEoEyo_jtrEeF-sNwLMC34VUlBsXXL5OfouaIf4rr8btoZ3meKlP_OyDGgUas3xE9hoHNaew46wTM7CquFfTuthe1xCsQm6duiy50&sai=AMfl-YSF8e8UEAxdRyMZI-wYrOw8jAaNSSyqPbRHyb7kOuqHZkcRhuVwWj3XjsbEnmuWGs2CSlqFda-mdwIgQ1KAsvNctR1Km3mpcnakckAM9g&sig=Cg0ArKJSzEwEyr645ufsEAE&urlfix=1&adurl=
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 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
Mon, 10 Sep 2018 14:28:38 GMT
activation
adstax-match.adrtx.net/ Frame 6568
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.127.173 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-127-173.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
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.chip.de/downloads/Android-File-Transfer_53192185.html
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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Mon, 10 Sep 2018 14:28:38 GMT
Server
akka-http/10.1.3
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
truncated
/ Frame 7A6F
10 KB
0
Stylesheet
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
08b3d2cb0ce50558fa5981857bf280e3e590f7853d3ae33e5f6b76597f2a58bb

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/css
truncated
/ Frame 7A6F
2 KB
0
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
aa7cda73ad0fdc3ee543442599840b5182eb66f5d5fbe6cf6e9a6d44c3e5551f

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
Origin
https://www.chip.de

Response headers

Access-Control-Allow-Origin
*
Content-Type
application/x-font-woff;charset=utf-8
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_fm6che7o/v/1/flavorId/1_ullm0yuj/name/
128 KB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_fm6che7o/v/1/flavorId/1_ullm0yuj/name/a.mp4
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:path
/p/1741931/sp/174193100/serveFlavor/entryId/1_fm6che7o/v/1/flavorId/1_ullm0yuj/name/a.mp4
pragma
no-cache
cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964; s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]; __gads=ID=804ba6a0a8d0be16:T=1536589718:S=ALNI_MZTD0Pkf-nVDT5pXzzwtYUnyU2d1w
accept-encoding
identity;q=1, *;q=0
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
chrome-proxy
frfr
accept
*/*
cache-control
no-cache
:authority
videos.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
range
bytes=0-
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Range
bytes=0-
chrome-proxy
frfr

Response headers

date
Mon, 10 Sep 2018 14:28:38 GMT
access-control-allow-methods
GET, HEAD, OPTIONS
x-vod-session
860765434
status
206
Content-Length
7070246
Content-Range
bytes 0-7070245/7070246
last-modified
Sun, 19 Nov 2000 08:52:00 GMT
server
nginx
etag
"3a1794b0-6be226"
x-vod-me
ny-front-vod17
content-type
video/mp4
access-control-allow-origin
*
access-control-expose-headers
Server,Content-Length,Content-Range,Date
cache-control
max-age=8640000
accept-ranges
bytes
access-control-allow-headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
expires
Wed, 19 Dec 2018 14:28:38 GMT
display.js
s.d.adup-tech.com/ads/ Frame 740A
4 KB
2 KB
Script
General
Full URL
https://s.d.adup-tech.com/ads/display.js?p=69139504101a193487ed1eb4af979f65
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/2355058/21691/970x250?ts=1536589718030&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.113 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-113.fra53.r.cloudfront.net
Software
nginx /
Resource Hash
76a77c2946e361ce2578a6ad8cb494c43cf10222212948aab1c36f0ffc467450

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 03:42:47 GMT
content-encoding
gzip
server
nginx
age
2732
etag
W/"901fdfb70ac30a6a59ef558ce35bbdbb"
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=3600
x-amz-cf-id
-zhiS9c682q2CyuGUcuJy1qVTxl0QCMn04zeon-NDF7tXA_nx7vG-Q==
via
1.1 1015c68f2d8c45924ae7198c984dcdde.cloudfront.net (CloudFront)
2x2
ad.yieldlab.net/d/724079/6629/ Frame 740A
2 KB
1 KB
Script
General
Full URL
https://ad.yieldlab.net/d/724079/6629/2x2?ts=489236910
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/2355058/21691/970x250?ts=1536589718030&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
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
21cd5a7b8c2cb9345c6bfe0b17f0c8d94e997314d1400644d837d67abc723587

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 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
577
Expires
Sun, 09 Sep 2018 14:28:38 GMT
m
ad.yieldlab.net/ Frame 740A
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=739302&ext_id=1
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/2355058/21691/970x250?ts=1536589718030&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT
imp
counts.yieldlab.net/ Frame 740A
0
360 B
Image
General
Full URL
https://counts.yieldlab.net/imp?s=21691&d=3855&a=2355058&ts=1536589718511&tid=aa8c0080-074a-45b4-886a-89983ed0108f&l=0
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT
readconsent.html
vibrant.mgr.consensu.org/ Frame 201F
0
0
Document
General
Full URL
https://vibrant.mgr.consensu.org/readconsent.html
Requested by
Host: images.intellitxt.com
URL: https://images.intellitxt.com/k/kormorant-1.28.06.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.78 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-78.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash

Request headers

:method
GET
:authority
vibrant.mgr.consensu.org
:scheme
https
:path
/readconsent.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.chip.de/downloads/Android-File-Transfer_53192185.html
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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html

Response headers

status
200
content-type
text/html
content-length
87
date
Thu, 24 May 2018 20:56:54 GMT
last-modified
Thu, 24 May 2018 20:20:03 GMT
etag
"d8bb22c98f002e29edc15d65b2a5c68c"
accept-ranges
bytes
server
AmazonS3
age
63064
x-cache
Hit from cloudfront
via
1.1 300b920cc4a53d2daec2ba8180596d82.cloudfront.net (CloudFront)
x-amz-cf-id
NLfam6nrQ_pJMHlSPKs4Fbt22PqUq9CmIkibX2twppAfYy9R2Pd3uw==
kormorant-1.28.06.min.css
images.intellitxt.com/k/
26 KB
7 KB
Stylesheet
General
Full URL
https://images.intellitxt.com/k/kormorant-1.28.06.min.css
Requested by
Host: images.intellitxt.com
URL: https://images.intellitxt.com/k/kormorant-1.28.06.min.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.126 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-126.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b0149cebf2aabd5f085727f8d89a2e95b844f0a646c69027c32d3027694e2a69

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 05 Sep 2018 08:07:57 GMT
content-encoding
gzip
last-modified
Tue, 04 Sep 2018 15:50:24 GMT
server
AmazonS3
age
454842
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/css
status
200
x-amz-cf-id
XmsWigHRVOA7hH33OLLFAtdVvlQcGfsWGILCccyk4KWL_x03Ad8Hlw==
via
1.1 23082ff4de65f70078e091bc7cd0cf24.cloudfront.net (CloudFront)
1
k.intellitxt.com/context/
13 B
506 B
XHR
General
Full URL
https://k.intellitxt.com/context/1
Requested by
Host: images.intellitxt.com
URL: https://images.intellitxt.com/k/kormorant-1.28.06.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
a821ef2e57f7a813859e0757693071df87135628c3d8f017bc499d0322afeba6

Request headers

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

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Allow
GET,HEAD,POST
Server
nginx
X-Powered-By
Kormorant
Vary
*
Content-Type
text/html; charset=utf-8
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
Content-Type
Content-Length
13
Expires
Fri, 08 Jan 2016 00:00:00 GMT
2729869184897373167
k.intellitxt.com/csync/0/appnexus/
Redirect Chain
  • https://ib.adnxs.com/getuid?https%3A%2F%2Fk.intellitxt.com%2Fcsync%2F0%2Fappnexus%2F%24UID
  • https://ib.adnxs.com/bounce?%2Fgetuid%3Fhttps%253A%252F%252Fk.intellitxt.com%252Fcsync%252F0%252Fappnexus%252F%2524UID
  • https://k.intellitxt.com/csync/0/appnexus/2729869184897373167
0
296 B
Image
General
Full URL
https://k.intellitxt.com/csync/0/appnexus/2729869184897373167
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Server
nginx
Connection
keep-alive
X-Powered-By
Express
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"

Redirect headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:40 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 302.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.53:80
AN-X-Request-Uuid
bf9a9749-f776-4f59-aae8-4c6fb674faaa
Server
nginx/1.13.4
Access-Control-Allow-Origin
*
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Location
https://k.intellitxt.com/csync/0/appnexus/2729869184897373167
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
usermatchredir
ssum-sec.casalemedia.com/
43 B
288 B
Image
General
Full URL
https://ssum-sec.casalemedia.com/usermatchredir?s=184543&cb=:redirect
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.21 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
Server
Apache
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
43
Expires
Mon, 10 Sep 2018 14:28:38 GMT
/
k.intellitxt.com/log/0/ptr/99a3c02c1abb1b7b7bc646d05c2cd2e20484e228/5154/32fa29ef-e3ae-45e0-bdf9-5c90d2264eac/
0
230 B
Image
General
Full URL
https://k.intellitxt.com/log/0/ptr/99a3c02c1abb1b7b7bc646d05c2cd2e20484e228/5154/32fa29ef-e3ae-45e0-bdf9-5c90d2264eac/
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
ETag
W/"a-b541a50d"
Server
nginx
X-Powered-By
Express
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Expires
0
select
ad.sxp.smartclip.net/
Redirect Chain
  • https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-Fi...
  • https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-Fi...
0
-1 B
XHR
General
Full URL
https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&x=9&d1=2&d10=5&d11=0&d12=2&d2=4&d3=5&d4=0&d7=1&d8=1&d9=2&d13=4&d14=0&d15=4&d16=0&d18=0&i9=4&i13=3&i3=2&i21=4&i1=3&i14=4&i8=4&g1=0&g2=1&g3=0&g4=0&g5=1&n1=1&n2=1&n3=1&n4=0&n5=1&n6=1&n7=0&n8=1&n9=0&sinbest=5&s1=0&s2=0&survey_cap=1&frq_n=1&oneclicker=1&qualified=0&tv=2&ct_gnd=0&ct_qvc=0&d20=4&ct_agraf=0&ct_qc=0&nuggsid=474493238&ang_contxt=1&inswipe=true&cu_burda_pmp_redirect=1&optout=&consent=&rnd=38116368&ang_testid=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
176.34.121.0 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-176-34-121-0.eu-west-1.compute.amazonaws.com
Software
nginx/1.11.3 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Server
nginx/1.11.3
Access-Control-Allow-Origin
https://www.chip.de
P3P
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Location
https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&x=9&d1=2&d10=5&d11=0&d12=2&d2=4&d3=5&d4=0&d7=1&d8=1&d9=2&d13=4&d14=0&d15=4&d16=0&d18=0&i9=4&i13=3&i3=2&i21=4&i1=3&i14=4&i8=4&g1=0&g2=1&g3=0&g4=0&g5=1&n1=1&n2=1&n3=1&n4=0&n5=1&n6=1&n7=0&n8=1&n9=0&sinbest=5&s1=0&s2=0&survey_cap=1&frq_n=1&oneclicker=1&qualified=0&tv=2&ct_gnd=0&ct_qvc=0&d20=4&ct_agraf=0&ct_qc=0&nuggsid=474493238&ang_contxt=1&inswipe=true&cu_burda_pmp_redirect=1&optout=&consent=&rnd=38116368&ang_testid=1
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html
Content-Length
161

Redirect headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
Server
nginx/1.11.3
Access-Control-Allow-Origin
https://www.chip.de
P3P
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Location
https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&x=9&d1=2&d10=5&d11=0&d12=2&d2=4&d3=5&d4=0&d7=1&d8=1&d9=2&d13=4&d14=0&d15=4&d16=0&d18=0&i9=4&i13=3&i3=2&i21=4&i1=3&i14=4&i8=4&g1=0&g2=1&g3=0&g4=0&g5=1&n1=1&n2=1&n3=1&n4=0&n5=1&n6=1&n7=0&n8=1&n9=0&sinbest=5&s1=0&s2=0&survey_cap=1&frq_n=1&oneclicker=1&qualified=0&tv=2&ct_gnd=0&ct_qvc=0&d20=4&ct_agraf=0&ct_qc=0&nuggsid=474493238&ang_contxt=1&inswipe=true&cu_burda_pmp_redirect=1&optout=&consent=&rnd=38116368&ang_testid=1
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html
Content-Length
161
global_config.json
hgc-cf-cache-1.svonm.com/
53 B
718 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/global_config.json?cache=7915260632
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG5hZUdoYWlURWlrZWlzaWU9bmFlR2hhaVRFaWtlaXNpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuWGR8fCh5LlhkPTApO3kuWGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5YZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5wZyhrKSxhLk9kKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQWMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYWQoYyk7YS5adChtKTthLll0KGspO2EuSXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vaz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbN107dGhpcy5Rdj10aGlzLmFbOV07CnRoaXMuJG49dGhpcy5hWzddO3RoaXMucG49dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbMTBdfWMuV3E9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9rOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5BdDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3A6dGhpcy5QdihhKX0sUHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlF2OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy4kbjp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYT1jLldxfHxoYSxIYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9SGMubmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRmE9InNldHVwIjt0aGlzLmZjPVtdO3RoaXMuWmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy52dC5iaW5kKHRoaXMpKX1jLmZqPWI7Yi5wcm90b3R5cGU9e1plOmZ1bmN0aW9uKCl7dGhpcy5sYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGxuOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLAoiKiIpfSx6YTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sdnQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMudXQoYS5kYXRhKX0sdXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxhLmV2ZW50bGlzdGVuZXIubGVuZ3RoO2IrKylhLmV2ZW50PT10aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSx1ZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxhZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmZxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuVWYoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxmcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxqbjpmdW5jdGlvbihhLApiKXthPT1iJiYoKGI9dGhpcy5hZihhKSl8fChiPWEpKTswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGxmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIrKztyZXR1cm4gYn0sc2Y6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LEV1OmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LExmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LE1mOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAsYz0wLGg9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2Y9dS5oZWlnaHQ7MD51LnRvcCYmKGYrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJgooZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZik7aD49YiYmKGU9ITApO3JldHVybiBlfSxsYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxzZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxoPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PAoyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09ZChoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtjPWU7bj11O2w9azt3PUk7cT1tO2ZvcihmPTA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpKwpxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTYwOzc5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtlPWUrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0KKGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihmKT9lPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLApkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5vbz8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmCiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLmRmKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT17Rmg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sClBoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHdrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LG9tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxsbzpmdW5jdGlvbigpe3JldHVybiBhLkZoKCl8fGEuUGgoKXx8YS5McSgpfHxhLndrKCl8fGEub20oKX19O3JldHVybiBhLmxvKCl9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAsYz1hLmxlbmd0aDtmPGM7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0seWY6ZnVuY3Rpb24oYSl7YT10aGlzLk1hKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0samI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXA6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGYucHVzaChhW2NdKTtyZXR1cm4gZn0sQXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxwZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuR2coYikrIjoiK3RoaXMuR2coTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5GYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5GYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZixjKXt2YXIgaD1hO2QmJmImJihiPWwuSGMoYixkKSk7YiYmKGg9bC5IYyhhLGIpKTtmJiYoaD1sLkhjKGgsZikpO2MmJihoPWwuSGMoaCxjKSk7ZS5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlopd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLmdlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLkthKGYsITApO2Y9bS5LYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkdhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9CiExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFBkOmZ1bmN0aW9uKCl7bSYmbS5aP20uaXNFbmFibGVkJiZtLklvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBkKCl9LmJpbmQodGhpcyksNTAwKX0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToiIn0sTWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSx4bzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLlJjKGEpfHx0aGlzLnVyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5uZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5sZihhKSlyZXR1cm4gdGhpcy5sZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueWIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuTGEoYSxiLnZhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlBjKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLmpuKGMsYSk7cmV0dXJuIGN9LExhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlopaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLkthKGEsaCk7aD1rLkthKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09CmRbcV07cmV0dXJuIGsuR2EoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKGEsYixkLGYsYyxrLGUsdSl9LmJpbmQodGhpcyksNTAwKX0sVWY6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHU9ITA7ZSYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7Zm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LFlyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLlVmKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmZjKWZvcih2YXIgYyBpbiB0aGlzLmZjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnliKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sVmY6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07CmMuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuTGEoYSxmLnZhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ZcihmLlBjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mYz1hfSxldzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuTGEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsCmQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sbW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSwKYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxxcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5manx8UDtuZXcgUDt2YXIgZT1uZXcgUDt3aW5kb3cuRHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5laj1iO2IuSGM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLm10PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9OwpiLkJwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuJHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hbj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5WbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuWW09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuY249e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlVtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLldtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIiwKbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnl2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5DcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnY9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTm89e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Tbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IiwKbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLiRtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5abT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUGU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9lPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmRuPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5YbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IudnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLmVqfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmxsPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVsxXTt0aGlzLlRtPXRoaXMuYVs0XTt0aGlzLmxrPXRoaXMuYVs2XTt0aGlzLldsPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMuVXY9YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Jcjp0aGlzLm1pKGEpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmk6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uczp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlRtOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Vdnx8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuSHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5naj0KYjtiLnByb3RvdHlwZT17R2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxpcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHwKbmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sSWM6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkljKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSWMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxZYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkdkKHRoaXMuZmIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5JYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sbHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYigpKwoiMiJ9LEpmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuR2QodGhpcy5pcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkljKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUT1jLmdqfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnNtPXRoaXMuYVsxMF07dGhpcy5VcD10aGlzLmFbMl07dGhpcy5Ydj10aGlzLmFbMV07dGhpcy52cD10aGlzLmFbM107dGhpcy54bT10aGlzLmFbN107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5ScT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs3XX1jLnJwPWI7Yi5wcm90b3R5cGU9e3JtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlVwOnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnA6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhtOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ibzp0aGlzLlFxKGEpfSxRcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgamE9Yy5ycHx8amEsS2M9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2Mucm0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOgovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuYz9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLkJlPWJ9KShjKTt2YXIgSj1jLkJlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5paT10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLkNpPWI7Yi5wcm90b3R5cGU9e2hpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5paTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuQ2l8fGthLExjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUxjLmhpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuTGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy55YT17fTt0aGlzLkE9bnVsbDt0aGlzLmNjPTEwMDt0aGlzLm5iPTA7dGhpcy54YT0xNTA7dGhpcy5zYj0wO3RoaXMuJHQoYil9LGI6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhPyh0aGlzLm5iKyssdGhpcy5zYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmNjKSk6CjA+dGhpcy54YSYmKHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYykpfSxMdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5iPnRoaXMueGE/ITA6ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5uYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sJHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sSjpmdW5jdGlvbihiKXt0aGlzLnlhW2IuZmIoKV09YjtLJiZLLlNmJiZLLkZ1KGIpfSxMdzpmdW5jdGlvbigpe3JldHVybiBlLkVhKHRoaXMueWEpfSxIOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX0scnI6ZnVuY3Rpb24oYil7Yj1iLkRhKCk7Zm9yKHZhciBhIGluIHRoaXMueWEpaWYoYi5pZD09dGhpcy55YVthXS5EYSgpLmlkKXJldHVybiEwOwpyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Ma3x8cjsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmNjPTEwO3RoaXMubmI9MDt0aGlzLnhhPTUwO3RoaXMuSz1udWxsO3RoaXMuamE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmhiPSIiO3RoaXMuZmY9ITE7dGhpcy5OKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGc9dGhpcy5EYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9ZyliLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxOOmZ1bmN0aW9uKCl7fSxlYTpmdW5jdGlvbigpe30saXU6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LApNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuVGQ9Yn0sS3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UZH0sU2Q6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhJiYodGhpcy5uYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuY2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGtlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sJHc6ZnVuY3Rpb24oKXt9LFM6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuR3EoKXx8CnRoaXMuZm4oKTt0aGlzLmtlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sR3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFA6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGtiOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApUdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE1kOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHFnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sS3Q6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LFB3OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxWdzpmdW5jdGlvbigpe3RoaXMuZmZ8fCh0aGlzLmZmPSEwKX0sSmM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sR3c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuTmt8fHA7KGZ1bmN0aW9uKGMpe2MuVmc9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYiwKYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuS2U9IjEiO3RoaXMuTGU9IjIiO3RoaXMuSG09IjMiO3RoaXMua2M9MDt0aGlzLllmPTMwO3RoaXMudmI9W107dGhpcy5RYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlJlPXRoaXMuS2c9ITE7dGhpcy5zdGF0dXM9dGhpcy5rYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuYWQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLktnfHwodGhpcy5LZz0hMCxlLlBkKCkpfSxXZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1ImJlIuWmImJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5mdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLApnKSx0aGlzLkNnKCksdGhpcy5SZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlFhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxDZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMudmImJjA8dGhpcy52Yi5sZW5ndGgmJih0aGlzLnZiPWUudW5pcXVlKHRoaXMudmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnZiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUWEpe2Zvcih2YXIgZz0wO2c8dGhpcy5RYS5sZW5ndGg7ZysrKXRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPT10aGlzLkxiW2JdJiZhLnB1c2godGhpcy5RYVtnXS5kZXRhaWwpLHRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPHRoaXMuTGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlFhW2ddLmRldGFpbCksYj10aGlzLlFhW2ddLnJlYXNvbik7dGhpcy5MYltiXXx8KGI9InVua25vd24iLGE9W10pOwowPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxPdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkxlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LG9iOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5rY30sTWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2V9LHV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5rY30sYWQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxhdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSwKYXM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLlZnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLmZ0PXRoaXMuYVsxMF07dGhpcy5ObT10aGlzLmFbNF07dGhpcy5paz10aGlzLmFbNV07dGhpcy5RbD10aGlzLmFbNl07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy50aD10aGlzLmFbOV07dGhpcy5Ucz10aGlzLmFbNF07dGhpcy5Qbj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e2ZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nazp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5NbShhKX0sTW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5tOnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pazp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlFsOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWw6dGhpcy5zaChhKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRoOnRoaXMuU3MoYSl9LFNzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Uczp0aGlzLk9uKGEpfSxPbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWE9Yy5wb3x8bWEsTWM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuZmsoNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnJiKGIpfS5iaW5kKHRoaXMpKX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFM9Yy5kaXx8UzsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMua2Q9bnVsbDt0aGlzLkR2PTFFMzt0aGlzLmVnPW51bGw7dGhpcy5ldj0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub28pYi5vbigicGxheSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuTXAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLkNxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuQnEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkd2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5IdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFxKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5RbyhhKX0uYmluZCh0aGlzKSl9LFFvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sR3Y6ZnVuY3Rpb24oYil7dGhpcy5rZHx8KHRoaXMua2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkl2KGIpfS5iaW5kKHRoaXMpLAp0aGlzLkR2KSl9LEl2OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtkKTt0aGlzLncoKX0sSHY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2QpfSxBcTpmdW5jdGlvbihiKXt0aGlzLkJ3KGIpO3RoaXMuZWc9bmV3IERhdGU7dGhpcy5lZy10aGlzLnJ0PHRoaXMuZXY/dGhpcy53KCk6dGhpcy5tKCl9LENxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuYWQobmV3IFMoYSkpKTt0aGlzLncoKX0sTXA6ZnVuY3Rpb24oKXt9LEJxOmZ1bmN0aW9uKCl7dGhpcy5ydD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBuYT1jLmNpfHxuYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkVhKHZpZGVvanMucGxheWVycykpe3ZhciBiPQp2aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuZWl8fG9hLHBhPW5ldyBvYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Eaz10aGlzLmFbMV07dGhpcy5TbD10aGlzLmFbN107dGhpcy5LaT10aGlzLmFbM107dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVszXX1jLlFyPWI7Yi5wcm90b3R5cGU9e0NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Eazp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2w6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuSW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlFyfHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dayg0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3RoaXMua2YoKTt0aGlzLm1mKCk7dGhpcy5Sbz0hMX0sa2Y6ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy4kYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5QKGIpfSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLiRiKXt2YXIgYj10aGlzLkRhKCksCmE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuJGI9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpfSxjZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLlRkJiYoMCx0aGlzLlRkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxrYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxKYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLnNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxvYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmJiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMubWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLldkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5ZZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5vYigpLHRoaXMuZ2V0UGxheWVyKCkuUm89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmhiO2EmJihhLllkKCksYS5zYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5tYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2QoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLllmJiYhdGhpcy5oYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMub2MuaW5kZXhPZihhKSYmdGhpcy5vYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm9jLmxlbmd0aD49dGhpcy5zZCYmdGhpcy5vKCkpfSxhczpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkV1KGEudmlkZW9UYWcpP2EuJGI/dGhpcy5tKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5tY3x8dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5rZigpLGEubWYoKSl9fSl9KShjKTt2YXIgc2E9Yy5yanx8c2E7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CmUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksCmQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5ycihnKXx8KHRoaXMuSihnKSxnPW5ldyBzYShnLHRoaXMuQSksZy5OKCksZy5iKCkpfWVsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSxJdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxjcTpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUueWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMudGp8fHRhLHVhPW5ldyB0YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuY3M9dGhpcy5hWzZdO3RoaXMuQmw9dGhpcy5hWzZdO3RoaXMuSGs9dGhpcy5hWzJdO3RoaXMuWGg9dGhpcy5hWzddO3RoaXMudnE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ubT1iO2IucHJvdG90eXBlPXticzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuR2soYSl9LEdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Iazp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGg6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgdmE9Yy5ubXx8dmEsT2M9bmV3IHZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PU9jLmJzKDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUChiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5TKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7CnZhciB3YT1jLnVtfHx3YTsoZnVuY3Rpb24oYyl7Yy50bT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB4YT1jLnRtfHx4YTsoZnVuY3Rpb24oYyl7Yy52bT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmCjA8ZS5FYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgd2EoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeGEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgeWE9Yy52bXx8eWEsemE9bmV3IHlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxpPXRoaXMuYVs0XTt0aGlzLnhoPXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLmh0PXRoaXMuYVs1XTt0aGlzLmp0PXRoaXMuYVs0XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLlpnPXRoaXMuYVsyXTsKdGhpcy5IcD10aGlzLmFbMl07dGhpcy54cD10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLmNyPWI7Yi5wcm90b3R5cGU9e2tpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5saTp0aGlzLndoKGEpfSx3aDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGg6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJzOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odDp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmp0OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5ZZyhhKX0sWWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpnOnRoaXMuR3AoYSl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IcDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuZzphfX19KShjKTt2YXIgQWE9Yy5jcnx8QWEsUGM9bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMua2koNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUChhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5TKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSwKcmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGtiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEJhPWMuZ218fEJhOyhmdW5jdGlvbihjKXtjLmZtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuaWE9dGhpcy5YYj10aGlzLldhPXRoaXMuc2M9ITE7dGhpcy5qZz1lLmxiKDEwKTt0aGlzLklnPSEwO3RoaXMud2Q9dGhpcy5HZj0hMTt0aGlzLiRmKCk7dGhpcy5GbygpO3RoaXMuSGEoKX0sV3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsdHlwZW9mIGIuYmEsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuYmE/Yi5iYS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuYmE/dHlwZW9mIGIuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS50YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYudGE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEudGE/Yi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS50YT90eXBlb2YgYi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYudGE/Yi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi50YT90eXBlb2YgYi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9kOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYub2Q6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYucGQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5wZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj8KdHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYudmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5qZyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sS2M6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LHVmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5YYn0scHI6ZnVuY3Rpb24oKXtpZighdGhpcy5GZil7dmFyIGI9CnRoaXMuZ2IoKSxhPXRoaXMubnIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLkZmPSEwKX1yZXR1cm4gdGhpcy5GZn0sbnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLnNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5zYz0hMCk7cmV0dXJuIHRoaXMuc2N9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LGhlOmZ1bmN0aW9uKCl7dGhpcy53ZD0hMDt2YXIgYj10aGlzLnVmKCk7aWYoYnx8dGhpcy5oYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTmI9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5OYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlgoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxIdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuJGUmJmIuYWRzJiYodGhpcy4kZT1iLmFkcyk7cmV0dXJuIHRoaXMuJGV9LEZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLldkKCl9LmJpbmQodGhpcykpfSxjZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWYoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNmKCl9LmJpbmQodGhpcyksNTApfSwkZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5wcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLktjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLktjKCksdGhpcy53ZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndkP3RoaXMubSgpOih0aGlzLlgoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5HZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuS2MoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlgoKSk6KHRoaXMuWCghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuR2Y9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxHbzpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuUWIhPWIuYWRzLnN0YXRlJiYodGhpcy5RYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5RYil7dGhpcy5tKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlFiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwO3RoaXMubSgiZW1wdHkgdmFzdCIpfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLklnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLklnLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKTG86ZnVuY3Rpb24oKXt0aGlzLlJ3fHwoMTA8dGhpcy5Fdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5KdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5Gdil7dGhpcy5Gdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQ2E9Yy5mbXx8Q2E7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLnZnKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy52ZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSx2ZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkVhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IEJhKGJbZ10pLGEuamF8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgQ2EoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYyl9fSl9KShjKTsKdmFyIERhPWMuaG18fERhLEVhPW5ldyBEYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VbD10aGlzLmFbNV07dGhpcy5Kaj10aGlzLmFbMTBdO3RoaXMuVmg9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuV249dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVszXTt0aGlzLnhpPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzFdfWMuWXM9YjtiLnByb3RvdHlwZT17SXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkpwOnRoaXMuVGwoYSl9LFRsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbDp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSmo6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZoOnRoaXMuc3MoYSl9LHNzOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudHM6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlduOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dbzp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueGk6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmlyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Zc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuUChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5TKGEpfSxlYTpmdW5jdGlvbigpe30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMueWx8fEdhOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdjPSExO3RoaXMua2coKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZ2M9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy53YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlhlKCk6dGhpcy5tKCl9LHdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5nYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZ2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy53Yy5iaW5kKHRoaXMpLAoxMDApfX0sWGU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhlLmJpbmQodGhpcyksNTApfX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5nYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhhPWMueGx8fEhhOyhmdW5jdGlvbihjKXtjLnpsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuemx8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs1XX1jLlZvPQpiO2IucHJvdG90eXBlPXtMbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1uOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgS2E9Yy5Wb3x8S2EsUmM9bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuTG4oNCk7KGZ1bmN0aW9uKGMpe2MuSWg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5aZj1hfSxOOmZ1bmN0aW9uKCl7fSxRZDpmdW5jdGlvbihiKXt0aGlzLlpmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpmKS5wYXJlbnROb2RlO3RoaXMuUChiKTt0aGlzLlMoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTGE9Yy5JaHx8TGE7KGZ1bmN0aW9uKGMpe2MuSGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxRZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIE1hPWMuSGh8fE1hOyhmdW5jdGlvbihjKXtjLkpoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IExhKGQsYSksdGhpcy5IKGQpfHwoZC5RZChhKSx0aGlzLkooZCksCmQ9bmV3IE1hKGQsdGhpcy5BLGcpLGQuUWQoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgTmE9Yy5KaHx8TmEsT2E9bmV3IE5hKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Yaj10aGlzLmFbMTBdO3RoaXMuR249dGhpcy5hWzhdO3RoaXMuWmg9dGhpcy5hWzhdO3RoaXMuT3A9dGhpcy5hWzldO3RoaXMuZGg9dGhpcy5hWzZdO3RoaXMueXQ9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy53cz1iO2IucHJvdG90eXBlPXtXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkduOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5aaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3A6CnRoaXMuYmgoYSl9LGJoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5kaDp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLndzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Xaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5QKGIpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0KIiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBRYT1jLmJrfHxRYTsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLm5jKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLApmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSkpOnRoaXMubmMoKX0sbmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFJhPWMuYWt8fFJhOyhmdW5jdGlvbihjKXtjLmNrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fAoodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuY2t8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy54dT10aGlzLmFbMTBdO3RoaXMuamg9dGhpcy5hWzJdO3RoaXMubHc9dGhpcy5hWzldO3RoaXMuemg9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVszXTt0aGlzLkZzPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs0XTt0aGlzLmR3PXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMudW89YjtiLnByb3RvdHlwZT17RG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHU6CnRoaXMuaWgoYSl9LGloOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qaDp0aGlzLmt3KGEpfSxrdzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHc6dGhpcy55aChhKX0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpoOnRoaXMucHcoYSl9LHB3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xdzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnM6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkttOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFVhPWMudW98fFVhLFRjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLkRvKDQpOwooZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlpkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUyhiKTp0aGlzLmRhKCl9LHN0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGIsZz10aGlzLmZiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlpiJiYoMDw9Zy5pbmRleE9mKGQpfHxhLllkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwKKHRoaXMuWmQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxrYjpmdW5jdGlvbigpe3RoaXMuWmQrKztpZigxMDx0aGlzLlpkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuQWt8fFZhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5pYisrLDE1PHRoaXMuaWIpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7CmVsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCl9fSwKd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLldhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLktwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5zdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuemt8fFdhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSChhKXx8KHRoaXMuSihhKSwobmV3IFdhKGEsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBYYT1jLkJrfHxYYSxZYT0KbmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmtwPXRoaXMuYVszXTt0aGlzLmxoPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMucW49YjtiLnByb3RvdHlwZT17S3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxzOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBaYT1jLnFufHxaYSxVYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy5Lcyg0KTsoZnVuY3Rpb24oYyl7Yy5iaj0KcC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlAoYi5lbGVtZW50KTt0aGlzLlMoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxYYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgJGE9Yy5ianx8JGE7KGZ1bmN0aW9uKGMpe2MuYWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBhYj1jLmFqfHxhYjsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgJGEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGFiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYmI9Yy5janx8YmIsY2I9bmV3IGJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJpPXRoaXMuYVsxMF07dGhpcy5Ccj10aGlzLmFbOF07dGhpcy5abz10aGlzLmFbN107CnRoaXMuU3A9dGhpcy5hWzJdO3RoaXMubGo9dGhpcy5hWzFdO3RoaXMubmg9dGhpcy5hWzVdO3RoaXMuSHM9dGhpcy5hWzRdO3RoaXMuSWk9dGhpcy5hWzEwXTt0aGlzLk1yPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzldfWMuSXE9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJpOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ccjp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm86dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNwOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JaToKdGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1yOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgZGI9Yy5JcXx8ZGIsVmM9bmV3IGRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuQWkoNCk7KGZ1bmN0aW9uKGMpe2Mubmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuc2YoYiwiZWxlbWVudElEIik7dGhpcy5nZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PQpiLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5QKGcpO3RoaXMuUyhnKTt0aGlzLkZjPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5GYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRmMpfSxYYTpmdW5jdGlvbigpe3JldHVybiEwfSxLbzpmdW5jdGlvbigpe2UuTGYodGhpcy5GYyk7ZS5NZih0aGlzLkZjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sTWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgZWI9Yy5uanx8ZWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGZiPWMubWp8fGZiOyhmdW5jdGlvbihjKXtjLm9qPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLmlucmVhZCl7dmFyIGI9ay5pbnJlYWQsYT1lLnNmKGIsImVsZW1lbnRJRCIpO2UuTGYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMub2p8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuUHE9dGhpcy5hWzRdO3RoaXMuUHI9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcz1iO2IucHJvdG90eXBlPXtpbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuamw6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBxOnRoaXMuT3IoYSl9LE9yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qcjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGliPWMucHN8fGliLFdjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLmlsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sYnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxnbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuSWE9YTt0aGlzLm9mPXRoaXMuVGc9ITE7dGhpcy5hZz1kO3RoaXMud2c9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuSWE9bmV3IHooYSkpO3ZhciBlPXRoaXMuUGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTsKaWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLktkKHRoaXMuSWEudXJsKSYmbS5nZCl7dmFyIGg9bmV3IHooYS51cmwpO2guYnUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5nYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uZ2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLmlqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5vZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMud2c/dGhpcy5QYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLlBhLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVGd8fCh0aGlzLlBhLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5QYS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsmJmsudnBhaWQmJm0mJm0uUmModGhpcy5JYS51cmwpJiZ0aGlzLlBhLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuUGEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuUGEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5LZCh0aGlzLklhLnVybCk/bS5nZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLktkKHRoaXMuSWEudXJsKSx0aGlzLmFnJiZ0aGlzLmFnKCl9cmV0dXJuIHRoaXMuUGF9fX0pKGMpO3ZhciBqYj1jLmlqfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnhkPXRoaXMuZWI9bnVsbDt0aGlzLmJwPXRoaXMucGI9dGhpcy5UZj0hMTt0aGlzLnZhPSIiO3RoaXMuT2Y9ITE7dGhpcy5CYT10aGlzLk5jPSIiO3RoaXMuS2Y9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuZWU9ITE7dGhpcy5PYT1bXTt0aGlzLkNmPXRoaXMuRmI9IiI7dGhpcy5CZD0hMTt0aGlzLnJlPTA7dGhpcy5GZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkRlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuamM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucWI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMuc2U9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5IZD0hMTt0aGlzLk1vPXRoaXMuaGQ9bnVsbDt0aGlzLmxlPXRoaXMuaGM9dGhpcy5KZz10aGlzLnVlPXRoaXMuZ2Q9dGhpcy55ZD10aGlzLmxjPSExO3RoaXMuUmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuamo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5PYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdyZWdleDp0aGlzLnhkLGpzcG9wdXBzOnRoaXMuVGYsc2lkZWxvYWRzOnRoaXMucGIsZGlzYWJsZXRlc3RzOnRoaXMuYnAsaG9tYWRBbGlhczp0aGlzLnZhLAppc0luaXRpYWxpemVkOnRoaXMuT2YsZ2xvYmFsQ29uZmlnOnRoaXMuTmMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLktmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuQ2YsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5CZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5yZSxIT01BRF9WRVJJRklFRDp0aGlzLkZlLEhPTUFEX0JMT0NLRUQ6dGhpcy5EZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5qYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRWUsdGVzdEhpZGU6dGhpcy5IYix0ZXN0VGFnczp0aGlzLnFiLHRlc3RUYWdzSlM6dGhpcy5JYix0ZXN0Q29va2llOnRoaXMuR2IsdGhyb3R0bGU6dGhpcy5zZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTW8sCmFkQmxvY2tlckRldGVjdGVkOnRoaXMubGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnlkLHVzZVN0cmljdENoZWNrczp0aGlzLmdkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUmEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMub2csZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaGMsc2tpcEFsbG93ZWQ6dGhpcy5sZX19LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlJhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUmFbYl0mJjE9PXRoaXMuUmFbYl0mJihhPSEwKTtyZXR1cm4gYX0saWU6ZnVuY3Rpb24oYSl7dGhpcy5SYVthXT0hMH0sZXE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuUmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5SYVtiXSYmMT09dGhpcy5SYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxvZTpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT0KdHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5tbyhhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLlJjKGEpO2U9dGhpcy5NYShhKTtjPyh0aGlzLmFjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsaz1lLnBhdGguc3Vic3RyKDEpKTooaD0KdGhpcy5nZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmVifHx0aGlzLnhkKSYmKGs9dGhpcy5vcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sUmM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmFjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGFjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLlJjKGEpO3JldHVybiBifSxncTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudmEmJjA8dGhpcy52YS5sZW5ndGgpcmV0dXJuIHRoaXMudmE7Zm9yKGQgaW4gdGhpcy52YSlpZihiPXRoaXMudmFbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuenc7cmV0dXJuIm5vbmUifSxQYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMub2ddfSxnZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGMoKSxiPXRoaXMuc2coKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb3M6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3JldHVybiBhfSxjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5PZj0hMDt0aGlzLk5jPWE7dGhpcy5CYT1iO3RoaXMuZWU9ZDt0aGlzLmhkPWM7dGhpcy5EYz1lO3RoaXMuRWI9Cmh8fHt9O3RoaXMuWHIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5WcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWmE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFhyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk5jK3RoaXMucWMoImdsb2JhbCIpKSx0aGlzLnRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LFZyOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnFjKCJjbGllbnQiKSk7dGhpcy5HYShuZXcgeih0aGlzLkJhK3RoaXMucWMoImNsaWVudCIpKSx0aGlzLnljLmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5pZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMubGIoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnlkKXt0aGlzLnlkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9O3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlo9dGhpcy5LZj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuRGUpKTt0aGlzLnRiKCk7ZS5UYihsLm10KTsoYj1lLnlmKHRoaXMuUGMoKSkpfHwoYj1lLnlmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx0cTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQmF8fHRoaXMuRmJ8fHRoaXMudmF8fHRoaXMueWMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy52YT1hLmFsaWFzfHxudWxsO3RoaXMuQ2Y9YS5hZHBhdGh8fCIiO3RoaXMuQmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5vZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnZhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfSxUYzpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTtpZihhKXt2YXIgYj0KbmV3IHoodGhpcy5nZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucWMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLkh1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJjdXN0b21lciIpO2E/dGhpcy5mbD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLmZsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5UYyghMCl9LmJpbmQodGhpcyksITApfX0sSHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLmdkPQp0aGlzLkpiKGIuc3RyaWN0KTt0aGlzLnVlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuSmc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnFiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMueGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVGY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5wYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaGM7dGhpcy5sZT1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkdiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mCkFycmF5P3RoaXMub3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLkJkJiYodGhpcy5HYj1udWxsKTt0aGlzLnNlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuSGQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkhkPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZHYoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMucWJ8fHRoaXMuR2IpP3RoaXMuZWU/KHRoaXMub2E9dGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSksdGhpcy56ZCgpLHRoaXMudGIoKSk6dGhpcy5TdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlR1KCkpfX0sU3U6ZnVuY3Rpb24oKXt0aGlzLlJ1KCl9LFR1OmZ1bmN0aW9uKCl7dGhpcy5aPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSk7dGhpcy50YigpfSxmZDpmdW5jdGlvbihhKXt0aGlzLmxjPQohMDt0aGlzLlp8fCh0aGlzLlo9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMudGIoKSx0aGlzLnpkKCkpfSxSdTpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemcoKX1lbHNlIHRoaXMuemcoKX0seWc6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoKSk7dGhpcy5XdShmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmZkKHRoaXMuamMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnFiPW51bGwsdGhpcy5wZSgpfSxXdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5HYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmxiKCkpO3RoaXMuWHUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnlnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnlnKCl9LFh1OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0scGU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLnJlKyssdGhpcy5HYShuZXcgeih0aGlzLkdiKSx0aGlzLlF1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFlKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMueGcoKX0scWU6ZnVuY3Rpb24oYSl7dGhpcy5mZCh0aGlzLkVlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sUXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucmU/dGhpcy5wZSgpOnRoaXMucWUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy54ZygpOnRoaXMucWUoIkFBQSIpfSx4ZzpmdW5jdGlvbigpe3RoaXMuWj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy51YikpO3RoaXMudGIoKTt0aGlzLnpkKCl9LHRiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMubGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLkZlKSk7dGhpcy5oZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhkJiZ0aGlzLmhkKCl9LEpvOmZ1bmN0aW9uKCl7aWYodGhpcy51ZSYmdGhpcy5FcSgpKXt2YXIgYT10aGlzLmVxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxDZzpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT0KYS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxHYTpmdW5jdGlvbihhLGIsYyxmLGgsSWMpe2E9bmV3IGpiKGEsYixjKTtmJiYoYS5UZz0hMCk7aCYmZS5zcigpJiYoYS5vZj0hMCk7SWMmJihhLndnPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFZlOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLkxhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmdhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuYWMoKXx8KGE9dGhpcy5NYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZ2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxJbzpmdW5jdGlvbigpe3RoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuR2EoYSx0aGlzLnh2LmJpbmQodGhpcyksdGhpcy53di5iaW5kKHRoaXMpKX0seHY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5EcCgpfSx3djpmdW5jdGlvbigpe30sRHA6ZnVuY3Rpb24oKXtlLlRiKGwuQ3ApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5wYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnBiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLkxhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUTt3aW5kb3dbYy5ZYigpXT10aGlzO2UuTGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuc2V9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LHNnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGtiPWMuamp8fGtiLG09bmV3IGtiO3dpbmRvdy5Fdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml3PXRoaXMuYVs4XTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLkVoPXRoaXMuYVs0XTt0aGlzLkZrPXRoaXMuYVs5XTt0aGlzLmJ3PXRoaXMuYVs1XTt0aGlzLk9sPXRoaXMuYVs4XTt0aGlzLnVuPXRoaXMuYVs2XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuQ2w9YjtiLnByb3RvdHlwZT17aHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLml3OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllpOnRoaXMuRGgoYSl9LERoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRms6dGhpcy5hdyhhKX0sYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ3OnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5PbDp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudW46dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgbGI9Yy5DbHx8bGIsWGM9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuaHcoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiLGMpe3RoaXMuaj1hO2EudS5MP3RoaXMuTmE9YS51LkwoKTp0aGlzLk5hPSIiO3RoaXMuY29udGFpbmVyPXRoaXMuai5TYTt0aGlzLnBsYXllcj10aGlzLmoudTt0aGlzLnRjPSExO3RoaXMua289MUUzO3RoaXMuY2E9bnVsbDt0aGlzLlQ9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5lZD17fTt0aGlzLnJjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMucmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5qLnUpJiZ0aGlzLmoudS5CJiYoYT10aGlzLmoudS5CKCkpLHRoaXMucmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5kZD0hMTt0aGlzLldmPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToKMTU7dGhpcy5zPXt9O3RoaXMucGM9ITE7dGhpcy5GZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuVG89ZS5wYSgxMCk7dGhpcy5XYz1lLnBhKDEwKTt0aGlzLlVkPWUucGEoMTApO3RoaXMudGc9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUmI9dGhpcy5CYj0hMTt0aGlzLkNkPW51bGw7dGhpcy5DYz10aGlzLnVnPXRoaXMuY2c9dGhpcy5HYz10aGlzLmZ2PXRoaXMuYWI9ITF9Yy5kaj1iO2IucHJvdG90eXBlPXtwZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxEZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5GYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmxjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLAoiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQobC5abSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpfSxPZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuVC5aKXRoaXMuVC5KbygpLHRoaXMuVC5vYSYmdGhpcy5ULmlzRW5hYmxlZD8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlQuaGN9KSk6Yj8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULmhjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5zYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5PZChhLGIsYyl9LDUwKX19LCRkOmZ1bmN0aW9uKGEpe3RoaXMuR2M9ITE7dGhpcy5zPWE7dGhpcy5qdSh0aGlzLnMpO3RoaXMuemYoYSl9LAp6ZjpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5lZD10aGlzLnFxKGEpKSx0aGlzLnpmKGEucGFyZW50KSl9LHFxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5ZKXtiPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksCmUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5VYShiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuRWMmJmEuRWMuZXJyb3ImJmEuRWMuZXJyb3IuY29kZSYmKGI9YS5FYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmljLmNvZGU6Yj09Qy5tZC5jb2RlP2UuRChsLk92LHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk6KGUuUGQoKSxiPT1DLkllLmNvZGUmJmUuRChsLnlzLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpO2UuRChsLkJwLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5HZS5jb2RlOmUuRChsLnl2LAp0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguSmUuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLkQobC5Wdix0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4Lm5kLmNvZGU6ZS5EKGwuJHYsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmxkLmNvZGU6ZS5EKGwuenMsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09CmMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLnpiKGEpO3RoaXMuc2EoKX0semI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5OZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuWHc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLm1uJiZ0aGlzLnBsYXllci5KYygpJiYoYi52b2x1bWU9CnRoaXMucGxheWVyLkpjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuaG4oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkJnKGIpPyh0aGlzLmtuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5PbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuSmQoKT90aGlzLnJnKCk6dGhpcy5zLm9yaWdpbi5oZih4LmxkKX0saHU6ZnVuY3Rpb24oKXtlLlplKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkFlJiZlLmxuKHRoaXMucy5vcmlnaW4uQWUpO2UuJGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmouQzt0aGlzLmouQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5qLkMsYSk7dGhpcy5qLmRnKCk7dGhpcy5qLmVjKCk7Zm9yKGE9dGhpcy5qLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuai5lYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmouRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuc3EoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5qLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnphKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLnVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5zYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmdGhpcy5KdigpLCJBZFN0YXJ0ZWQiPT0KYS5kYXRhLm5hbWUmJnRoaXMuS3YoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk52KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk12KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx2KCkpfS5iaW5kKHRoaXMpKTtlLnVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLnNhKCl9LmJpbmQodGhpcykpO2UudWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5zYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmouZW4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKS3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sSnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS4kYSgiaW1wcmVzc2lvbiIpfSxRZzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS4kYSgic3RhcnQiKX0sUGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS4kYSgiZmlyc3RRdWFydGlsZSIpfSxOdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLiRhKCJ0aGlyZFF1YXJ0aWxlIil9LE12OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLiRhKCJjb21wbGV0ZSIpfSxMdjpmdW5jdGlvbigpe2UuJGEoImFkc3RvcHBlZCIpO3RoaXMuc2EoKX0saG46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5UO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5hYygpPyhmPWUuTWEoZiksYj1mLnByb3RvY29sKwoiOi8vIitmLmhvc3QpOmI9ZjtjLnNyYz1iLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuQXYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxCZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LGtuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLk9nLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sJGM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuT2cuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sT2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlby5jb250cm9scz0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksdGhpcy5rbyl9LHhlOmZ1bmN0aW9uKGEpe3RyeXtpZighZS5ZYSgpJiZ0aGlzLlQuSmcmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLnMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuVC5nYSgidmlkZW8tbm9vcCIpKTsKcmV0dXJufX1jYXRjaChiKXt9dGhpcy50Y3x8IXRoaXMuQmcodGhpcy52aWRlbyl8fHRoaXMuQmJ8fCh0aGlzLnRjPSEwLHRoaXMuenYoKSx0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHRoaXMuai5lYygpLHRoaXMuTGcoKSx0aGlzLk1nKCksdGhpcy5UZSgpLHRoaXMuai5kZygpLHRoaXMudmlkZW8ucGxheSYmdGhpcy5uZSgpKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy5DYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLk9jPVtdO2Zvcih2YXIgYj10aGlzLmouRyxjPTA7YzxiLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5PYy5wdXNoKGIuY2hpbGRyZW5bY10pLGIuY2hpbGRyZW5bY10uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLnJkKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5yZCgpfWVsc2UgdGhpcy5yZCgpfSxyZDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspdGhpcy5PY1thXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGE9dGhpcy52aWRlby5wbGF5KCkpJiZhWyJjYXRjaCJdKWFbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5zYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwiIiwhMCkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5lKCkpfS5iaW5kKHRoaXMpOwp0aGlzLnhmKCkucWcodGhpcyl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLkQobC5VbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMucy54Yj8odGhpcy50Yz0hMSx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZGQ9ITEsdGhpcy5qLkhnKCksdGhpcy5zLm9yaWdpbi5WZCgpKTp0aGlzLnNhKCl9LEF2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuJGModGhpcy52aWRlbyksdGhpcy5KZCgpPwp0aGlzLnJnKCk6dGhpcy5qZChhKSl9LGpkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuVmUoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZSgpKTt0aGlzLnMub3JpZ2luLmhmKHgubGQpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnYpdGhpcy5zYSgpO2Vsc2V7dGhpcy5aYj0hMDt0aGlzLmoudS5rYiYmIXRoaXMudWcmJnRoaXMuai51LmtiKCkmJmUuRChsLkFjLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLmt2KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5tZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50Zyk7YyYmKGI9dGhpcy5zLm1lLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5kZHx8KHRoaXMuZGQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGwuJG0sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTt0aGlzLnMueGI/KHRoaXMudGM9ITEsdGhpcy4kYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmRkPSExLHRoaXMuai5IZygpLHRoaXMucy5vcmlnaW4uVmQoKSk6dGhpcy5zYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5yYy5yZXBsYWNlKCJbdGltZV0iLGUucGYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMucGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHJnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5scSgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5lYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuTmcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuTGcoKTt0aGlzLk1nKCk7dGhpcy5DZD1zZXRJbnRlcnZhbCh0aGlzLkhvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sbHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZj1iPXRoaXMucy5NW2NdLGU7ZT1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLmFjKCkmJihlPWguTWEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKSG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLkNkKSx0aGlzLndlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMueWUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuQ2QpLHRoaXMuamQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmNnPSEwLHRoaXMuR2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxrdjpmdW5jdGlvbihhKXthPT10aGlzLkZnfHx0aGlzLkJifHwoMD09YSYmKHRoaXMuYWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYWIpLHRoaXMuYWI9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLkVnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5FZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5CYnx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUuRChsLldtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSksZS5EKGwuYW4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSx0aGlzLlJiJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5HYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChsLlZtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLkQobC5ZbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5EKGwuY24sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSksZS5EKGwuZG4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSwKdGhpcy5GZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5CYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnJxKHRoaXMucy5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmVkLmltcHJlc3Npb25zJiZlLnFyKGYudXJsLHRoaXMuZWQuaW1wcmVzc2lvbnMpP3RoaXMuTmQoZi51cmwsZi50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UuRChsLlhtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSx7YWRJZDp0aGlzLmVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5OZChmLnVybCxmLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy5BYT10aGlzLiRvKHRoaXMucy5BYSxhKSl9fSxOZDpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuS2EoYSksYyYmYS5nbihjKSxmfHwoZj10aGlzLmdmKSx0aGlzLlQuR2EoYSxmLHRoaXMuZ2YsITEsITApKX0scnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSwkbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx6djpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5OZy5iaW5kKHRoaXMpfSxOZzpmdW5jdGlvbigpe2UuRChsLk5vLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkdjJiZlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZS5acCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMueGN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnhjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucmMucmVwbGFjZSgiW3RpbWVdIixlLnBmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LE1nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Ubzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmJkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuV2M7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaHYuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlVkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ3YuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5WYi5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMudGc7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5tZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLmJkLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LlhhJiZ0aGlzLmoudS5YYSgpJiZ0aGlzLnVzKCk7dGhpcy5WYigpfX0sVmI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxiZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxodjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuV2MpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQobC5PZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sWWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLldjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuT2UsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5XYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sZ3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlVkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LHVzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LENiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYik7dGhpcy5DY3x8dGhpcy5wY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmUoKSl9LHNhOmZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkZhJiZ0aGlzLnBjfHwicG9zdHJvbGwiPT1lLkZhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5lYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5BZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLkFkKCl9ZWxzZSB0aGlzLkFkKCl9LEFkOmZ1bmN0aW9uKCl7dGhpcy51Zz0hMDt0aGlzLmouQmYoKTsKdGhpcy5qLk50KCk7dGhpcy5aYj0hMTtlLkQobC5Tbyx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMueGYoKS5LdCgpfSx4ZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxKZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51YSgibWluVmlzIik7YSYmKGUuTWYodGhpcy52aWRlbyxhKT90aGlzLk10KCk6dGhpcy5ZZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy54YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy54Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LGdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmRqfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs5XTt0aGlzLlN0PXRoaXMuYVsxMF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5QbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVszXX1jLlJzPWI7Yi5wcm90b3R5cGU9e1JrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tazp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlN0OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUG06dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5Sc3x8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuUmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5ZPW51bGw7dGhpcy5NYj0hMTt0aGlzLkFlPSIiO3RoaXMuemU9ITE7ZCYmZC5lbXB0eT90aGlzLiRyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmVtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ub2UodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuYWYodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5vZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5vZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KImNvbWFwcHNwb3RpbWEzdnBhaWQiKSxiLmRhdGEuaG9tYWRfY29tcGF0aWJsZV92cGFpZD0idHJ1ZSIpO20uR2EoYix0aGlzLlpyLmJpbmQodGhpcyksdGhpcy5Xci5iaW5kKHRoaXMpKX0scWY6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsKIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysKKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe31lbHNlIGMuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxacjpmdW5jdGlvbihhKXt0aGlzLkR0KGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4Lm5kKSl9dGhpcy5iYT0KdGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LCRyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkphfHwodGhpcy5KYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQ2EoeC5uZCkpfXRoaXMuYmE9dGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LFdyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguR2Use2RlcHRoOmF9KSl9LFVjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLnZyKCk/dGhpcy5ZdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFmKCksZyx7QWRTeXN0ZW06dGhpcy5YcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5mYSh0aGlzLkNhKHguSmUpKTooYT0wLHRoaXMudXYoKSYmdGhpcy4kZCh0aGlzLlVvKCkpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLk1iPyh0aGlzLk1iPTE8dGhpcy5iYS5sZW5ndGgsdGhpcy5iYS5sZW5ndGgmJnRoaXMuVWMoKSk6dGhpcy5wYXJlbnQuVmQoKX0sdXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WdSgpP3RoaXMuVXUoKT8hMDooLTEhPXRoaXMuVWIoKT90aGlzLmZhKHRoaXMuQ2EoeC5DZSkpOnRoaXMuZmEodGhpcy5DYSh4LmJpKSksITEpOih0aGlzLmZhKHRoaXMuQ2EoeC5pYyxDLkllKSksITEpfSwkZDpmdW5jdGlvbihhKXthLkFhPWEuQWEuY29uY2F0KHRoaXMuUmQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC4kZChhKX0sVW86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMudmYoKTthLnhjPXRoaXMuJHAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLldwKCk7YS5tZT10aGlzLnBxKGEuZHVyYXRpb24pOwpyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oYil7dGhpcy5ZJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguQ2UuY29kZT9iLkFhLmNvbmNhdCh0aGlzLmJxKCkpOmIuQWEuY29uY2F0KHRoaXMuanEoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuemImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC56YiYmdGhpcy5wYXJlbnQuemIoYiksYT0wLHRoaXMuVWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0saGY6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxWdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMudmYoKS5sZW5ndGh9LApVdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sRHQ6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLkFlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy56ZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2cjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQWYoKS5sZW5ndGh9LEFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FZCh0aGlzLlksIkFkU3lzdGVtIil9LFJkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxnLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuVWEoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxqcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxicTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCnZmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksdWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEN3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlVhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnVjKS1NYXRoLmFicyg3MDAtYi51Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS51YyktTWF0aC5hYnMoNzAwLWIudWMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZz1bXSxiPSExLGQ9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTWMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVWEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGV8fG0mJm0ubGUpdHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkF1KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToKIiJ9LE1jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlprPXRoaXMuYVs0XTt0aGlzLmd3PXRoaXMuYVs2XTt0aGlzLkRyPXRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbNV07dGhpcy5DdT10aGlzLmFbNl07dGhpcy5Taj10aGlzLmFbN107dGhpcy5xcD10aGlzLmFbNV07dGhpcy5Rcz10aGlzLmFbMTBdO3RoaXMuZz10aGlzLmFbMl19Yy5udj1iO2IucHJvdG90eXBlPXtZazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWms6dGhpcy5mdyhhKX0sZnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmd3OnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkRyOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NbDp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3U6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Tajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMubnZ8fHBiLFpjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLllrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMueGM9IiI7dGhpcy5PPQp0aGlzLnhiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Laz1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxzcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG5iPWMuS2t8fG5iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Wcz10aGlzLmFbOV07dGhpcy56cj10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzhdO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuams9YjtiLnByb3RvdHlwZT17aXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmp2OnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wczp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenI6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuQ20oYSl9LApDbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG06dGhpcy5JdShhKX0sSXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkp1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5qa3x8cWIsJGM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9JGMuaXYoNCk7dmFyIHg9e25kOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLGthOiJYTUxfUEFSU0VfRVJST1IifSxiaTp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsa2E6IkRVUkFUSU9OX0VSUk9SIn0saWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLAprYToiRU1QVFlfVkFTVCJ9LEplOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLGthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxHZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKa2E6IkxPQURfRVJST1IifSxsZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsa2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxydzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixrYToiTUVESUFGSUxFX0VSUk9SIn0sQ2U6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsa2E6IkRVTU1ZX0FEIn19LEM9e0hlOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsa2E6Ik5PX0FEUyJ9LEllOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixrYToiTk9fTUVESUFGSUxFUyJ9LHR3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixrYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG1kOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLGthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm51PXRoaXMuYVsxXTt0aGlzLlhzPXRoaXMuYVs0XTt0aGlzLmhsPXRoaXMuYVsxXTt0aGlzLk9qPXRoaXMuYVsxXTt0aGlzLnRvPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMuQ2g9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm51OnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaGw6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Pajp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcmI9Yy5DaHx8cmIsYWQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQubXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5FYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgb2I9Yy5MaXx8b2I7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU3I9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLkVpPQp0aGlzLmFbNF07dGhpcy5kbD10aGlzLmFbNF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5haD10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkxtPWI7Yi5wcm90b3R5cGU9e1JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNrOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5tcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWk6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbjp0aGlzLlZ0KGEpfSxWdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV3Q6dGhpcy4kZyhhKX0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTG18fHNiLGJkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuU2E9YS5yZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuVGE9e307dGhpcy5RZj0hMTt0aGlzLldiPVtdfWMuamk9YjtiLnByb3RvdHlwZT17bnE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMubnEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLm9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxHdTpmdW5jdGlvbigpe3RoaXMuUWY9ITB9LEhnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxkZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2UuRChsLkFjLHRoaXMudS5CKCkpfSxOdDpmdW5jdGlvbigpe3RoaXMuUWZ8fCh0aGlzLnUucGxheSgpLGUuRChsLkJjLHRoaXMudS5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlNhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5TYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlNhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuU2Eub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5TYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5TYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUucmYoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5EZi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sb3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGFxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sRGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hcSh0aGlzLlNhKTsKaWYoYi54IT10aGlzLlRhLnh8fGIueSE9dGhpcy5UYS55fHxiLnBvc2l0aW9uIT10aGlzLlRhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlRhLndpZHRofHxiLmhlaWdodCE9dGhpcy5UYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5UYS53aWR0aCYmMDx0aGlzLlRhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmYoKTtyZXR1cm59dGhpcy5UYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuV2IubGVuZ3RoO2ErKyl0aGlzLldiW2FdKHt3aWR0aDpiLndpZHRoLApoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLkRmLmJpbmQodGhpcyksMTApfSxlbjpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy5XYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuV2IucHVzaChhKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTj1jLmppfHxOLEI9W10sdGI9MDsxMDA+dGI7dGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRxPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVs5XTt0aGlzLnpxPXRoaXMuYVs2XTt0aGlzLkVuPXRoaXMuYVsxXTt0aGlzLlVyPXRoaXMuYVs5XTt0aGlzLnduPXRoaXMuYVsxXTt0aGlzLmJ0PXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLmlwPXRoaXMuYVs3XTt0aGlzLmdpPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuT3M9YjtiLnByb3RvdHlwZT17WnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRxOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLnlxKGEpfSx5cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenE6dGhpcy5EbihhKX0sCkRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVXI6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnduOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idDp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHY6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmlwOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5naTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMuT3N8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLlpxKDQpOyhmdW5jdGlvbihjKXtjLnVrPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMua2UoYik7dGhpcy5lZigpfSxrZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKa2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy51a3x8dmI7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7CnRoaXMud2I9dGhpcy53Ynx8ITE7dGhpcy5OZT10aGlzLlFlPXRoaXMuSGY9dGhpcy5pYT10aGlzLnRlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTHAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRlPSEwO3RoaXMuSGYmJnRoaXMuWWUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudmMoKTsKdGhpcy5IZj0hMDt0aGlzLlllKCl9LmJpbmQodGhpcykpO3RoaXMuVWUoKX0sWWU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy52YygpO2lmKCF0aGlzLnRlJiYhdGhpcy52YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudGUmJnRoaXMuTmUmJiF0aGlzLlFlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHdmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApVZTpmdW5jdGlvbigpe2lmKHRoaXMudmMoKSl7dmFyIGI9dGhpcy53ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlFlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuTmU9Yi55d310aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZSgpfS5iaW5kKHRoaXMpLDEwMCl9LEZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlN3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxrcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxMcDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpjKCl9LmJpbmQodGhpcyksMTAwKX0semM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5RYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmtxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCnRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk9rLkltLkdtP3dpbmRvdy5PTy5Pay5JbS5HbS53dyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cigpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMudmt8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQW89dGhpcy5hWzhdO3RoaXMua3I9dGhpcy5hWzhdO3RoaXMuTHU9dGhpcy5hWzNdO3RoaXMuUWs9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy52cz1iO2IucHJvdG90eXBlPXt6bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW86dGhpcy5qcihhKX0sanI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtyOnRoaXMuS3UoYSl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB6Yj1jLnZzfHx6YixkZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1kZC56byg0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMudmx8fFU7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkudGQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuSXMoYSl9LmJpbmQodGhpcykpO3kuRHEoKX0sSXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLnVsfHxWOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLlZjJiYoYj1lLmFwKGIsdGhpcy5WYykpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLAoiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGJbYV0pLGQ9bmV3IFUoaCksdGhpcy5IKGQpfHwodGhpcy5KKGQpLGY9bmV3IFYoZCx0aGlzLkEpLGYuYigpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sdGQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2JdfHwodGhpcy5hYVtiXT17fSk7dGhpcy5hYVtiXVthXXx8KHRoaXMuYWFbYl1bYV09W10pO3RoaXMuYWFbYl1bYV0ucHVzaChjKX0sWnU6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5hYXx8CnRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuYmN8fCh0aGlzLmJjPVtdKSx0aGlzLmJjLnB1c2goYiksdGhpcy5MdCgpJiYodGhpcy5sZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYwPHRoaXMuYWFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYV1bY11bZF0oYil9fSxEcTpmdW5jdGlvbigpe2lmKHRoaXMuYmMpZm9yKHZhciBiPTA7Yjx0aGlzLmJjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuYmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuYWFbY11bZF1bZl0oYSl9fSwKdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5adShiKX19KX0pKGMpO3ZhciBBYj1jLndsfHxBYix5PW5ldyBBYihxKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLmptPXRoaXMuYVsyXTt0aGlzLnFsPXRoaXMuYVs1XTt0aGlzLmxzPXRoaXMuYVszXTt0aGlzLmVvPXRoaXMuYVs0XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLktsPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJGk6CnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Rajp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFsOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sczp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW86dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51aTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLktsfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5GbCg0KTsoZnVuY3Rpb24oYyl7Yy5NaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPQohMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxrYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLk1ofHxDYjsoZnVuY3Rpb24oYyl7Yy5OaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucXR8fCh0aGlzLnF0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5OaHx8RGI7KGZ1bmN0aW9uKGMpe2MuT2g9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLAp0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy55YSlpZihhPT10aGlzLnlhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5PaHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs2XTt0aGlzLmFpPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzhdfWMubWs9YjtiLnByb3RvdHlwZT17dWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZoOnRoaXMuJGgoYSl9LCRoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5haTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdiPWMubWt8fApHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5sbT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEhiPWMubG18fEhiOyhmdW5jdGlvbihjKXtjLmttPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuU2V8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLlZwfHwodGhpcy5JZigpLAp0aGlzLlZwPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLlNlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5TZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxZcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sSWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLllwKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5pYT0hMCx0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLm8oKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZigpfS5iaW5kKHRoaXMpLDUwKX0sUXc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSGIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBJYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEpiPWMubW18fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SaD10aGlzLmFbMV07dGhpcy5ydT10aGlzLmFbNF07dGhpcy5oaD10aGlzLmFbOF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5waD10aGlzLmFbNF07dGhpcy5xaz10aGlzLmFbOV07dGhpcy56dT10aGlzLmFbOF07dGhpcy55bj10aGlzLmFbNl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5lcj10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e1FoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUmg6dGhpcy5xdShhKX0scXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ1OnRoaXMuZ2goYSl9LGdoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5oaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU246dGhpcy5vaChhKX0sCm9oOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5waDp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucWs6dGhpcy55dShhKX0seXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnp1OnRoaXMueG4oYSl9LHhuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bjp0aGlzLm53KGEpfSxudzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub3c6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgTGI9Yy5Obnx8TGIsZ2Q9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuUWgoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXIoInBsYXllclBsYXlFbmQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5bGlzdFBsYXlOZXh0IixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuRGp8fE1iOyhmdW5jdGlvbihjKXtjLkNqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IixmdW5jdGlvbigpe3RoaXMubmYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm5mKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLmJuKCl9LmJpbmQodGhpcykpLHRoaXMuU2c9ITEsdGhpcy5Sdj0xRTMsdGhpcy5mZz17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG5mOmZ1bmN0aW9uKCl7dGhpcy5mZy5kb25lfHwodGhpcy5mZy5kb25lPSEwLHRoaXMuU2c9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksdGhpcy5SdikpfSxibjpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5TZyk7dGhpcy5tKCl9LFJnOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksdGhpcy53KCkpfSx0ZjpmdW5jdGlvbihiKXt2YXIgYT1bXTtpZihiKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJmJbY11bZF0mJmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZj1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7CmEucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLnRmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMudGYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwO3JldHVybiExfX0pfSkoYyk7dmFyIE5iPWMuQ2p8fE5iOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj0KbnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjJiYoYz1uZXcgTWIoYyksdGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgTmIoYyx0aGlzLkEpKS5iKCkpKX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2I9Yy5Fanx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNzPXRoaXMuYVs1XTsKdGhpcy54aj10aGlzLmFbMl07dGhpcy5tdj10aGlzLmFbMl07dGhpcy56aj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5CaD10aGlzLmFbMV07dGhpcy5ybz10aGlzLmFbOF07dGhpcy5RaT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLlFuPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dczp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueGo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm12OnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuemo6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktuOnRoaXMuQWgoYSl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CaDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm86dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5RaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIFFiPWMuUW58fFFiLGhkPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLkJzKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgUmI9Yy5zbHx8UmI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5MZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGQoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLAoiSU1BIiksdGhpcy5vKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTApfSxMZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5ybHx8U2I7KGZ1bmN0aW9uKGMpe2MudGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgUmIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFNiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBUYj1jLnRsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzhdO3RoaXMuQm09dGhpcy5hWzddO3RoaXMucWo9dGhpcy5hWzEwXTt0aGlzLmR0PXRoaXMuYVsxXTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVs4XTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLk51PQp0aGlzLmFbMl07dGhpcy5nPXRoaXMuYVs3XX1jLkpzPWI7Yi5wcm90b3R5cGU9e0J2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLkFtKGEpfSxBbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJtOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xajp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHQ6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RcDp0aGlzLm92KGEpfSxvdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnB2OnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5GbTp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHA6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk51OnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFZiPWMuSnN8fFZiLGlkPW5ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkJ2KDQpOyhmdW5jdGlvbihjKXtjLmFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5QKGIpO3RoaXMuUyhiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmFlPSExfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy50dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpOwpiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LER1OmZ1bmN0aW9uKCl7dGhpcy5hZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFdiPWMuYWx8fFdiOyhmdW5jdGlvbihjKXtjLiRrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5LYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5qcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuS2J8fCh0aGlzLktiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLktifHx0aGlzLktiKyssdGhpcy5LYjw9dGhpcy5qcz8odGhpcy5LYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKX0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRHUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFhiPWMuJGt8fFhiOyhmdW5jdGlvbihjKXtjLmJsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBXYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBYYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFliPWMuYmx8fFliLFpiPW5ldyBZYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5waT10aGlzLmFbOV07dGhpcy5wdT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkRzPWI7Yi5wcm90b3R5cGU9e29pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5waTp0aGlzLm91KGEpfSxvdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucHU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOgphfX19KShjKTt2YXIgJGI9Yy5Ec3x8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQub2koNCk7KGZ1bmN0aW9uKGMpe2MuV2s9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy5Xa3x8YWM7KGZ1bmN0aW9uKGMpe2MuVms9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRGEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMub2IoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5QbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkxjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5OcigpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxQbzpmdW5jdGlvbigpe3RoaXMuTWUoKXx8dGhpcy5vKCEwKX0sTnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7IWIubWEmJgpiLmJhJiZiLnZ3JiZiLnh3JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmcpZm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkRhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PQphJiYodGhpcy5iZz1iW2NdKTtyZXR1cm4gdGhpcy5iZ30sTGQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuTGMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKTp0aGlzLncoKTp0aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmM9Yy5Wa3x8YmM7KGZ1bmN0aW9uKGMpe2MuWGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5wbGF5ZXJhcGkpe3ZhciBiPWsucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgYWMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBjYz1jLlhrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzJdO3RoaXMucnY9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy5vbD1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZwOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HaTp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3I6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm5sOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucnY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLm9sfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5FcCg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApwYXVzZTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJgoodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9Yy5aanx8VzsoZnVuY3Rpb24oYyl7Yy5Zaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5iZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLmJlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuYmUmJmIhPXRoaXMuYmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5VdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWD1jLllqfHxYOyhmdW5jdGlvbihjKXtjLiRqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBXKGIpLGIuamE/dGhpcy5sZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBYKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCxmYz1jLiRqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5wYi5sZW5ndGgpe3ZhciBhPW0ucGIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuVmYuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlZmKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudHY9dGhpcy5hWzJdO3RoaXMuZXM9dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzZdO3RoaXMuUHU9dGhpcy5hWzJdO3RoaXMuQXA9dGhpcy5hWzZdO3RoaXMuc2k9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbN119Yy55cD1iO2IucHJvdG90eXBlPXtzdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVzOnRoaXMuYnYoYSl9LGJ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5jdjp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlB1OnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcDp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc2k6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLnlwfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5zdig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUChhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYz8odGhpcy5TKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy54cz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sWHQ6ZnVuY3Rpb24oYil7dGhpcy5xZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54c30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLnFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5xZCYmKG5ldyBHKHRoaXMsdGhpcy5xZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLklsfHxNOyhmdW5jdGlvbihjKXtjLkhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5EZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJgp3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLmd1KCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwKMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLGEpKTpiLmwoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEc9Yy5IbHx8RzsoZnVuY3Rpb24oYyl7Yy5KbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy54YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkgoYil8fAoodGhpcy5KKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYi5YdCh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgaWM9Yy5KbHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaD10aGlzLmFbOV07dGhpcy4kbD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5ncz10aGlzLmFbMl07dGhpcy5maD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLm5vPWI7Yi5wcm90b3R5cGU9e0toOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaDp0aGlzLlpsKGEpfSxabDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56aTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdzOnRoaXMuZWgoYSl9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5maDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPQpjLm5vfHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5LaCg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5iZj0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5TKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iZn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksCjQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuYmY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3lvOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5Vanx8bGM7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWXc6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQmUobmV3IGZ1bmN0aW9uKCl7fSk7CmEuc3c9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuRnQoYSk7d2luZG93LkF3PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0fHwodGhpcy5FdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLklkfHwodGhpcy5JZD0xKTtpZigyMDx0aGlzLklkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTsKcmV0dXJufXRoaXMuSWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTsKd2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT0KdHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0saGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMuVGp8fG1jOyhmdW5jdGlvbihjKXtjLlZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgbmM9Yy5Wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5zPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzhdfWMubnQ9YjtiLnByb3RvdHlwZT17TXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5zOnRoaXMud3EoYSl9LHdxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLm50fHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Ncyg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpO2EmJnRoaXMuUChhLnBhcmVudE5vZGUpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpOwp2YXIgWT1jLkxqfHxZOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkVmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5XYT10aGlzLnNjPSExO3RoaXMuamc9ZS5sYigxMCk7dGhpcy5OZigpfSxOZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuSGEoKSwhMDt0aGlzLkVmKys7aWYoMTA8dGhpcy5FZil0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5vKCEwKToKdGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLAoyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5Lanx8WjsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYKKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5xPXRoaXMuYVsyXTt0aGlzLktxPXRoaXMuYVs0XTt0aGlzLnNuPXRoaXMuYVsxXTt0aGlzLlVrPXRoaXMuYVsxXTt0aGlzLlB0PXRoaXMuYVs4XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNF07dGhpcy5hdj10aGlzLmFbMTBdO3RoaXMuem09dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNl19Yy5Hcj1iO2IucHJvdG90eXBlPXtNcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk5xOnRoaXMuSnEoYSl9LEpxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LcTp0aGlzLnJuKGEpfSxybjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLnNuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWs6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnZvKGEpfSx2bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud286dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmF2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56bTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMuR3J8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLk1xKDQpOyhmdW5jdGlvbihjKXtjLk5pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5QKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5OaXx8dGM7KGZ1bmN0aW9uKGMpe2MuTWk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksCnRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5NaXx8dWM7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRWEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7CmVsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgdmM9Yy5PaXx8dmMsd2M9bmV3IHZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVszXTt0aGlzLkN0PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVs0XTt0aGlzLlZxPXRoaXMuYVszXTt0aGlzLlp2PXRoaXMuYVs1XTt0aGlzLmJtPXRoaXMuYVsyXTt0aGlzLlhvPXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuSGo9YjtiLnByb3RvdHlwZT17U3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DdDp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSms6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMuWXYoYSl9LApZdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWnY6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ibTp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhvOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ZcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHhjPWMuSGp8fHhjLHBkPW5ldyB4YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXBkLlNxKDQpOyhmdW5jdGlvbihjKXtjLlVpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuUChiKSx0aGlzLlMoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciB5Yz1jLlVpfHx5YzsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5XZSgpfSxXZTpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2UoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIHpjPWMuVGl8fHpjOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIuamEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5IKGIpKXt0aGlzLkooYik7KG5ldyB6YyhiLHRoaXMuQSkpLmIoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIEFjPWMuVml8fEFjLEJjPW5ldyBBYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbOV07dGhpcy5Dbj10aGlzLmFbNl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs5XX1jLkdoPWI7Yi5wcm90b3R5cGU9CntYbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW46dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlV0OnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLkJuKGEpfSxCbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ246dGhpcy5pbyhhKX0saW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5HaHx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuWG4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUGY9dGhpcy5TZj10aGlzLlJmPSExO3RoaXMuWGM9W107dGhpcy5mZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT0KdHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRhP251bGw6VGEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBZYT9udWxsOllhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLApiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgY2I/bnVsbDpjYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaGI/bnVsbDpoYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE9hP251bGw6T2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHBhP251bGw6cGF9fWMuTWs9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5tcShhKTpbXSxiO3RoaXMuU2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuUmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMubWcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmZlKXtpZih0aGlzLlBmKWJyZWFrO2I9dGhpcy5mZVtjXTt0aGlzLnZlKGIpJiYodGhpcy5YYy5wdXNoKGIpLHRoaXMubWcoYikpfX0sdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxtcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5mZVtjXSx0aGlzLnZlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEpe3RoaXMudmUoYSkmJmEuYigpfSxGdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YKcCYmIXRoaXMuUmYpZm9yKHRoaXMuUGY9ITAsYT0wO2E8dGhpcy5YYy5sZW5ndGg7YSsrKXRoaXMuWGNbYV0uc2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5YY1thXS5zYil9fX0pKGMpO3ZhciBEYz1jLk1rfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YZz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLldpPWI7Yi5wcm90b3R5cGU9e1dnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLldpfHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5XZyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuVGIobC52diksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuVGIobC5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTsKdmFyIHNkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZWE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IFEsaz0hMTtGLlliKCk7Ri5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuWWIoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkpmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5ZYigpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxGLmxyKCkse2lkOnRkfSl9LDUwMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dT10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbMTBdO3RoaXMuVW49dGhpcy5hWzVdOwp0aGlzLnlrPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzddfWMuSHE9YjtiLnByb3RvdHlwZT17c3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnR1OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TaTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQmo6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlVuOnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLkhxfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC5zdSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuaGc9dGhpcy5jb25mPXRoaXMuVmE9CnRoaXMucGxheWVyPW51bGw7dGhpcy5TYz0wO3RoaXMuTmE9IiI7dGhpcy5ZYz1bXTt0aGlzLlpjPTA7dGhpcy5pZz0hMTt0aGlzLmNlPVtdfWMuVWc9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5oZz1hfSxhZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuTmE9dGhpcy5wbGF5ZXIuTCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFp0OmZ1bmN0aW9uKGEpe3RoaXMuVmE9YX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuTGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLlZhKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMubXIoKSl0aGlzLlZhLmModGhpcy5WYS5OYyx0aGlzLlZhLkJhLHRoaXMuVmEuZWUsZnVuY3Rpb24oKXt0aGlzLmRjKGEsYil9LmJpbmQodGhpcyksdGhpcy5WYS5EYyk7ZWxzZSBpZih0aGlzLkZxKCkpdGhpcy5RdChmdW5jdGlvbigpe3RoaXMuZGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChsLkFjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkd1KCk7ay5leGl0RnVsbHNjcmVlbigpO1I9az1uZXcgTyhrLAp0aGlzLlZhLGgpO2sucGcodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX1hPXRoaXMuaHMoYSk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk1kJiYoYz10aGlzLnBsYXllci5NZCgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5PZChhLGMsZik7dGhpcy5wbGF5ZXIucWcoayl9fSxtcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlNjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuU2MuZ2V0VGltZSgpLHRoaXMuU2M9YSwzRTU8Yj8hMDohMTt0aGlzLlNjPWE7cmV0dXJuITF9LHZ1OmZ1bmN0aW9uKCl7ZS5qZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudWEoImFkVGFnIik7dGhpcy51YSgicHJlcm9sbEFkVGFnIikmJgooYT10aGlzLnVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5qZihhKSk/dGhpcy5kYyhhKTooc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX0sdXU6ZnVuY3Rpb24oYSl7ZS5qZSgicG9zdHJvbGwiKTtpZighdGhpcy5oZyl7dGhpcy5kdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZihjKSk/dGhpcy5kYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKSl9fSxqZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9CmEoYil9cmV0dXJuIGF9LEh0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaXUodGhpcy51dS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5lYSgpfSxjZDpmdW5jdGlvbihhKXtlLmplKCJtaWRyb2xsIik7aWYoIXRoaXMuWGYpe3RoaXMuWGY9ITA7dmFyIGI9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy51YSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuZGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGY9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX19LEd0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5TZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy52dSgpO3RoaXMucGxheWVyLlNkJiZ0aGlzLkd0KCk7dGhpcy5IdCgpfSxJdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5ZYy5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLlpjPXRoaXMuWWMubGVuZ3RofSxGcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5aYyYmKGE9ITApO3JldHVybiBhfSxRdDpmdW5jdGlvbihhKXt0aGlzLmlnPWE7Zm9yKGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdWyJmdW5jdGlvbiJdKHRoaXMud3QuYmluZCh0aGlzKSl9LHd0OmZ1bmN0aW9uKGEpe3RoaXMuWmMtLTthJiZ0aGlzLmNlLnB1c2goYSk7MD49dGhpcy5aYyYmdGhpcy5pZygpfSxoczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5jZS5sZW5ndGg7YysrKWI9CnRoaXMuY2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuVWd8fGdhLFI9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnI9dGhpcy5hWzEwXTt0aGlzLm9wPXRoaXMuYVszXTt0aGlzLnJoPXRoaXMuYVs2XTt0aGlzLmRtPXRoaXMuYVs2XTt0aGlzLmx1PXRoaXMuYVszXTt0aGlzLnB0PXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVsxMF07dGhpcy5obz10aGlzLmFbMTBdO3RoaXMuUm09dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzhdfWMudmk9YjtiLnByb3RvdHlwZT17YXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJyOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5xaChhKX0scWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJoOnRoaXMuY20oYSl9LApjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmRtOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sdTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHQ6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRoOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYz1jLnZpfHxHYyx2ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj12ZC5hcig0KX0pLmNhbGwobmFlR2hhaVRFaWtlaXNpZSxuYWVHaGFpVEVpa2Vpc2llKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.73 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-73.fra53.r.cloudfront.net
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 04:42:28 GMT
Via
1.1 ed0c487879f809919537bf00a2f2dc8f.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
53
Last-Modified
Mon, 10 Sep 2018 04:42:03 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
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
hiG2ajlzXKCotIxXmJ3w_lTa5FNT9ROy3sjopNtFsn6PhVxcA7mR7w==
Expires
0
homadConfig.json
filestorage.chip.de/videoplayer//config/
323 B
677 B
XHR
General
Full URL
https://filestorage.chip.de/videoplayer//config/homadConfig.json?cache=7330682766
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG5hZUdoYWlURWlrZWlzaWU9bmFlR2hhaVRFaWtlaXNpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuWGR8fCh5LlhkPTApO3kuWGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5YZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5wZyhrKSxhLk9kKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQWMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYWQoYyk7YS5adChtKTthLll0KGspO2EuSXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vaz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbN107dGhpcy5Rdj10aGlzLmFbOV07CnRoaXMuJG49dGhpcy5hWzddO3RoaXMucG49dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbMTBdfWMuV3E9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9rOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5BdDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3A6dGhpcy5QdihhKX0sUHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlF2OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy4kbjp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYT1jLldxfHxoYSxIYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9SGMubmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRmE9InNldHVwIjt0aGlzLmZjPVtdO3RoaXMuWmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy52dC5iaW5kKHRoaXMpKX1jLmZqPWI7Yi5wcm90b3R5cGU9e1plOmZ1bmN0aW9uKCl7dGhpcy5sYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGxuOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLAoiKiIpfSx6YTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sdnQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMudXQoYS5kYXRhKX0sdXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxhLmV2ZW50bGlzdGVuZXIubGVuZ3RoO2IrKylhLmV2ZW50PT10aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSx1ZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxhZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmZxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuVWYoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxmcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxqbjpmdW5jdGlvbihhLApiKXthPT1iJiYoKGI9dGhpcy5hZihhKSl8fChiPWEpKTswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGxmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIrKztyZXR1cm4gYn0sc2Y6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LEV1OmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LExmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LE1mOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAsYz0wLGg9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2Y9dS5oZWlnaHQ7MD51LnRvcCYmKGYrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJgooZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZik7aD49YiYmKGU9ITApO3JldHVybiBlfSxsYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxzZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxoPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PAoyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09ZChoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtjPWU7bj11O2w9azt3PUk7cT1tO2ZvcihmPTA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpKwpxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTYwOzc5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtlPWUrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0KKGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihmKT9lPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLApkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5vbz8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmCiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLmRmKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT17Rmg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sClBoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHdrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LG9tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxsbzpmdW5jdGlvbigpe3JldHVybiBhLkZoKCl8fGEuUGgoKXx8YS5McSgpfHxhLndrKCl8fGEub20oKX19O3JldHVybiBhLmxvKCl9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAsYz1hLmxlbmd0aDtmPGM7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0seWY6ZnVuY3Rpb24oYSl7YT10aGlzLk1hKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0samI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXA6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGYucHVzaChhW2NdKTtyZXR1cm4gZn0sQXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxwZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuR2coYikrIjoiK3RoaXMuR2coTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5GYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5GYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZixjKXt2YXIgaD1hO2QmJmImJihiPWwuSGMoYixkKSk7YiYmKGg9bC5IYyhhLGIpKTtmJiYoaD1sLkhjKGgsZikpO2MmJihoPWwuSGMoaCxjKSk7ZS5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlopd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLmdlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLkthKGYsITApO2Y9bS5LYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkdhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9CiExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFBkOmZ1bmN0aW9uKCl7bSYmbS5aP20uaXNFbmFibGVkJiZtLklvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBkKCl9LmJpbmQodGhpcyksNTAwKX0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToiIn0sTWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSx4bzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLlJjKGEpfHx0aGlzLnVyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5uZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5sZihhKSlyZXR1cm4gdGhpcy5sZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueWIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuTGEoYSxiLnZhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlBjKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLmpuKGMsYSk7cmV0dXJuIGN9LExhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlopaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLkthKGEsaCk7aD1rLkthKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09CmRbcV07cmV0dXJuIGsuR2EoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKGEsYixkLGYsYyxrLGUsdSl9LmJpbmQodGhpcyksNTAwKX0sVWY6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHU9ITA7ZSYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7Zm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LFlyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLlVmKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmZjKWZvcih2YXIgYyBpbiB0aGlzLmZjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnliKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sVmY6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07CmMuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuTGEoYSxmLnZhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ZcihmLlBjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mYz1hfSxldzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuTGEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsCmQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sbW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSwKYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxxcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5manx8UDtuZXcgUDt2YXIgZT1uZXcgUDt3aW5kb3cuRHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5laj1iO2IuSGM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLm10PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9OwpiLkJwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuJHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hbj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5WbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuWW09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuY249e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlVtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLldtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIiwKbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnl2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5DcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnY9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTm89e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Tbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IiwKbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLiRtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5abT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUGU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9lPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmRuPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5YbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IudnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLmVqfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmxsPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVsxXTt0aGlzLlRtPXRoaXMuYVs0XTt0aGlzLmxrPXRoaXMuYVs2XTt0aGlzLldsPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMuVXY9YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Jcjp0aGlzLm1pKGEpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmk6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uczp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlRtOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Vdnx8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuSHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5naj0KYjtiLnByb3RvdHlwZT17R2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxpcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHwKbmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sSWM6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkljKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSWMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxZYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkdkKHRoaXMuZmIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5JYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sbHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYigpKwoiMiJ9LEpmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuR2QodGhpcy5pcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkljKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUT1jLmdqfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnNtPXRoaXMuYVsxMF07dGhpcy5VcD10aGlzLmFbMl07dGhpcy5Ydj10aGlzLmFbMV07dGhpcy52cD10aGlzLmFbM107dGhpcy54bT10aGlzLmFbN107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5ScT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs3XX1jLnJwPWI7Yi5wcm90b3R5cGU9e3JtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlVwOnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnA6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhtOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ibzp0aGlzLlFxKGEpfSxRcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgamE9Yy5ycHx8amEsS2M9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2Mucm0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOgovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuYz9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLkJlPWJ9KShjKTt2YXIgSj1jLkJlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5paT10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLkNpPWI7Yi5wcm90b3R5cGU9e2hpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5paTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuQ2l8fGthLExjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUxjLmhpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuTGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy55YT17fTt0aGlzLkE9bnVsbDt0aGlzLmNjPTEwMDt0aGlzLm5iPTA7dGhpcy54YT0xNTA7dGhpcy5zYj0wO3RoaXMuJHQoYil9LGI6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhPyh0aGlzLm5iKyssdGhpcy5zYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmNjKSk6CjA+dGhpcy54YSYmKHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYykpfSxMdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5iPnRoaXMueGE/ITA6ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5uYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sJHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sSjpmdW5jdGlvbihiKXt0aGlzLnlhW2IuZmIoKV09YjtLJiZLLlNmJiZLLkZ1KGIpfSxMdzpmdW5jdGlvbigpe3JldHVybiBlLkVhKHRoaXMueWEpfSxIOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX0scnI6ZnVuY3Rpb24oYil7Yj1iLkRhKCk7Zm9yKHZhciBhIGluIHRoaXMueWEpaWYoYi5pZD09dGhpcy55YVthXS5EYSgpLmlkKXJldHVybiEwOwpyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Ma3x8cjsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmNjPTEwO3RoaXMubmI9MDt0aGlzLnhhPTUwO3RoaXMuSz1udWxsO3RoaXMuamE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmhiPSIiO3RoaXMuZmY9ITE7dGhpcy5OKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGc9dGhpcy5EYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9ZyliLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxOOmZ1bmN0aW9uKCl7fSxlYTpmdW5jdGlvbigpe30saXU6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LApNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuVGQ9Yn0sS3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UZH0sU2Q6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhJiYodGhpcy5uYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuY2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGtlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sJHc6ZnVuY3Rpb24oKXt9LFM6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuR3EoKXx8CnRoaXMuZm4oKTt0aGlzLmtlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sR3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFA6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGtiOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApUdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE1kOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHFnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sS3Q6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LFB3OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxWdzpmdW5jdGlvbigpe3RoaXMuZmZ8fCh0aGlzLmZmPSEwKX0sSmM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sR3c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuTmt8fHA7KGZ1bmN0aW9uKGMpe2MuVmc9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYiwKYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuS2U9IjEiO3RoaXMuTGU9IjIiO3RoaXMuSG09IjMiO3RoaXMua2M9MDt0aGlzLllmPTMwO3RoaXMudmI9W107dGhpcy5RYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlJlPXRoaXMuS2c9ITE7dGhpcy5zdGF0dXM9dGhpcy5rYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuYWQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLktnfHwodGhpcy5LZz0hMCxlLlBkKCkpfSxXZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1ImJlIuWmImJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5mdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLApnKSx0aGlzLkNnKCksdGhpcy5SZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlFhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxDZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMudmImJjA8dGhpcy52Yi5sZW5ndGgmJih0aGlzLnZiPWUudW5pcXVlKHRoaXMudmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnZiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUWEpe2Zvcih2YXIgZz0wO2c8dGhpcy5RYS5sZW5ndGg7ZysrKXRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPT10aGlzLkxiW2JdJiZhLnB1c2godGhpcy5RYVtnXS5kZXRhaWwpLHRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPHRoaXMuTGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlFhW2ddLmRldGFpbCksYj10aGlzLlFhW2ddLnJlYXNvbik7dGhpcy5MYltiXXx8KGI9InVua25vd24iLGE9W10pOwowPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxPdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkxlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LG9iOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5rY30sTWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2V9LHV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5rY30sYWQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxhdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSwKYXM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLlZnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLmZ0PXRoaXMuYVsxMF07dGhpcy5ObT10aGlzLmFbNF07dGhpcy5paz10aGlzLmFbNV07dGhpcy5RbD10aGlzLmFbNl07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy50aD10aGlzLmFbOV07dGhpcy5Ucz10aGlzLmFbNF07dGhpcy5Qbj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e2ZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nazp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5NbShhKX0sTW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5tOnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pazp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlFsOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWw6dGhpcy5zaChhKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRoOnRoaXMuU3MoYSl9LFNzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Uczp0aGlzLk9uKGEpfSxPbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWE9Yy5wb3x8bWEsTWM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuZmsoNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnJiKGIpfS5iaW5kKHRoaXMpKX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFM9Yy5kaXx8UzsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMua2Q9bnVsbDt0aGlzLkR2PTFFMzt0aGlzLmVnPW51bGw7dGhpcy5ldj0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub28pYi5vbigicGxheSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuTXAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLkNxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuQnEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkd2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5IdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFxKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5RbyhhKX0uYmluZCh0aGlzKSl9LFFvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sR3Y6ZnVuY3Rpb24oYil7dGhpcy5rZHx8KHRoaXMua2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkl2KGIpfS5iaW5kKHRoaXMpLAp0aGlzLkR2KSl9LEl2OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtkKTt0aGlzLncoKX0sSHY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2QpfSxBcTpmdW5jdGlvbihiKXt0aGlzLkJ3KGIpO3RoaXMuZWc9bmV3IERhdGU7dGhpcy5lZy10aGlzLnJ0PHRoaXMuZXY/dGhpcy53KCk6dGhpcy5tKCl9LENxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuYWQobmV3IFMoYSkpKTt0aGlzLncoKX0sTXA6ZnVuY3Rpb24oKXt9LEJxOmZ1bmN0aW9uKCl7dGhpcy5ydD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBuYT1jLmNpfHxuYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkVhKHZpZGVvanMucGxheWVycykpe3ZhciBiPQp2aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuZWl8fG9hLHBhPW5ldyBvYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Eaz10aGlzLmFbMV07dGhpcy5TbD10aGlzLmFbN107dGhpcy5LaT10aGlzLmFbM107dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVszXX1jLlFyPWI7Yi5wcm90b3R5cGU9e0NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Eazp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2w6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuSW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlFyfHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dayg0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3RoaXMua2YoKTt0aGlzLm1mKCk7dGhpcy5Sbz0hMX0sa2Y6ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy4kYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5QKGIpfSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLiRiKXt2YXIgYj10aGlzLkRhKCksCmE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuJGI9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpfSxjZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLlRkJiYoMCx0aGlzLlRkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxrYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxKYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLnNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxvYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmJiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMubWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLldkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5ZZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5vYigpLHRoaXMuZ2V0UGxheWVyKCkuUm89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmhiO2EmJihhLllkKCksYS5zYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5tYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2QoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLllmJiYhdGhpcy5oYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMub2MuaW5kZXhPZihhKSYmdGhpcy5vYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm9jLmxlbmd0aD49dGhpcy5zZCYmdGhpcy5vKCkpfSxhczpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkV1KGEudmlkZW9UYWcpP2EuJGI/dGhpcy5tKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5tY3x8dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5rZigpLGEubWYoKSl9fSl9KShjKTt2YXIgc2E9Yy5yanx8c2E7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CmUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksCmQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5ycihnKXx8KHRoaXMuSihnKSxnPW5ldyBzYShnLHRoaXMuQSksZy5OKCksZy5iKCkpfWVsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSxJdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxjcTpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUueWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMudGp8fHRhLHVhPW5ldyB0YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuY3M9dGhpcy5hWzZdO3RoaXMuQmw9dGhpcy5hWzZdO3RoaXMuSGs9dGhpcy5hWzJdO3RoaXMuWGg9dGhpcy5hWzddO3RoaXMudnE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ubT1iO2IucHJvdG90eXBlPXticzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuR2soYSl9LEdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Iazp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGg6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgdmE9Yy5ubXx8dmEsT2M9bmV3IHZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PU9jLmJzKDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUChiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5TKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7CnZhciB3YT1jLnVtfHx3YTsoZnVuY3Rpb24oYyl7Yy50bT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB4YT1jLnRtfHx4YTsoZnVuY3Rpb24oYyl7Yy52bT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmCjA8ZS5FYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgd2EoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeGEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgeWE9Yy52bXx8eWEsemE9bmV3IHlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxpPXRoaXMuYVs0XTt0aGlzLnhoPXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLmh0PXRoaXMuYVs1XTt0aGlzLmp0PXRoaXMuYVs0XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLlpnPXRoaXMuYVsyXTsKdGhpcy5IcD10aGlzLmFbMl07dGhpcy54cD10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLmNyPWI7Yi5wcm90b3R5cGU9e2tpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5saTp0aGlzLndoKGEpfSx3aDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGg6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJzOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odDp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmp0OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5ZZyhhKX0sWWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpnOnRoaXMuR3AoYSl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IcDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuZzphfX19KShjKTt2YXIgQWE9Yy5jcnx8QWEsUGM9bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMua2koNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUChhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5TKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSwKcmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGtiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEJhPWMuZ218fEJhOyhmdW5jdGlvbihjKXtjLmZtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuaWE9dGhpcy5YYj10aGlzLldhPXRoaXMuc2M9ITE7dGhpcy5qZz1lLmxiKDEwKTt0aGlzLklnPSEwO3RoaXMud2Q9dGhpcy5HZj0hMTt0aGlzLiRmKCk7dGhpcy5GbygpO3RoaXMuSGEoKX0sV3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsdHlwZW9mIGIuYmEsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuYmE/Yi5iYS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuYmE/dHlwZW9mIGIuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS50YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYudGE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEudGE/Yi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS50YT90eXBlb2YgYi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYudGE/Yi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi50YT90eXBlb2YgYi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9kOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYub2Q6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYucGQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5wZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj8KdHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYudmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5qZyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sS2M6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LHVmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5YYn0scHI6ZnVuY3Rpb24oKXtpZighdGhpcy5GZil7dmFyIGI9CnRoaXMuZ2IoKSxhPXRoaXMubnIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLkZmPSEwKX1yZXR1cm4gdGhpcy5GZn0sbnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLnNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5zYz0hMCk7cmV0dXJuIHRoaXMuc2N9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LGhlOmZ1bmN0aW9uKCl7dGhpcy53ZD0hMDt2YXIgYj10aGlzLnVmKCk7aWYoYnx8dGhpcy5oYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTmI9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5OYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlgoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxIdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuJGUmJmIuYWRzJiYodGhpcy4kZT1iLmFkcyk7cmV0dXJuIHRoaXMuJGV9LEZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLldkKCl9LmJpbmQodGhpcykpfSxjZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWYoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNmKCl9LmJpbmQodGhpcyksNTApfSwkZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5wcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLktjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLktjKCksdGhpcy53ZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndkP3RoaXMubSgpOih0aGlzLlgoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5HZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuS2MoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlgoKSk6KHRoaXMuWCghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuR2Y9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxHbzpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuUWIhPWIuYWRzLnN0YXRlJiYodGhpcy5RYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5RYil7dGhpcy5tKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlFiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwO3RoaXMubSgiZW1wdHkgdmFzdCIpfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLklnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLklnLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKTG86ZnVuY3Rpb24oKXt0aGlzLlJ3fHwoMTA8dGhpcy5Fdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5KdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5Gdil7dGhpcy5Gdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQ2E9Yy5mbXx8Q2E7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLnZnKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy52ZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSx2ZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkVhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IEJhKGJbZ10pLGEuamF8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgQ2EoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYyl9fSl9KShjKTsKdmFyIERhPWMuaG18fERhLEVhPW5ldyBEYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VbD10aGlzLmFbNV07dGhpcy5Kaj10aGlzLmFbMTBdO3RoaXMuVmg9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuV249dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVszXTt0aGlzLnhpPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzFdfWMuWXM9YjtiLnByb3RvdHlwZT17SXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkpwOnRoaXMuVGwoYSl9LFRsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbDp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSmo6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZoOnRoaXMuc3MoYSl9LHNzOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudHM6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlduOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dbzp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueGk6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmlyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Zc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuUChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5TKGEpfSxlYTpmdW5jdGlvbigpe30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMueWx8fEdhOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdjPSExO3RoaXMua2coKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZ2M9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy53YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlhlKCk6dGhpcy5tKCl9LHdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5nYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZ2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy53Yy5iaW5kKHRoaXMpLAoxMDApfX0sWGU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhlLmJpbmQodGhpcyksNTApfX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5nYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhhPWMueGx8fEhhOyhmdW5jdGlvbihjKXtjLnpsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuemx8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs1XX1jLlZvPQpiO2IucHJvdG90eXBlPXtMbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1uOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgS2E9Yy5Wb3x8S2EsUmM9bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuTG4oNCk7KGZ1bmN0aW9uKGMpe2MuSWg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5aZj1hfSxOOmZ1bmN0aW9uKCl7fSxRZDpmdW5jdGlvbihiKXt0aGlzLlpmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpmKS5wYXJlbnROb2RlO3RoaXMuUChiKTt0aGlzLlMoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTGE9Yy5JaHx8TGE7KGZ1bmN0aW9uKGMpe2MuSGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxRZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIE1hPWMuSGh8fE1hOyhmdW5jdGlvbihjKXtjLkpoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IExhKGQsYSksdGhpcy5IKGQpfHwoZC5RZChhKSx0aGlzLkooZCksCmQ9bmV3IE1hKGQsdGhpcy5BLGcpLGQuUWQoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgTmE9Yy5KaHx8TmEsT2E9bmV3IE5hKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Yaj10aGlzLmFbMTBdO3RoaXMuR249dGhpcy5hWzhdO3RoaXMuWmg9dGhpcy5hWzhdO3RoaXMuT3A9dGhpcy5hWzldO3RoaXMuZGg9dGhpcy5hWzZdO3RoaXMueXQ9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy53cz1iO2IucHJvdG90eXBlPXtXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkduOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5aaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3A6CnRoaXMuYmgoYSl9LGJoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5kaDp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLndzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Xaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5QKGIpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0KIiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBRYT1jLmJrfHxRYTsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLm5jKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLApmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSkpOnRoaXMubmMoKX0sbmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFJhPWMuYWt8fFJhOyhmdW5jdGlvbihjKXtjLmNrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fAoodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuY2t8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy54dT10aGlzLmFbMTBdO3RoaXMuamg9dGhpcy5hWzJdO3RoaXMubHc9dGhpcy5hWzldO3RoaXMuemg9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVszXTt0aGlzLkZzPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs0XTt0aGlzLmR3PXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMudW89YjtiLnByb3RvdHlwZT17RG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHU6CnRoaXMuaWgoYSl9LGloOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qaDp0aGlzLmt3KGEpfSxrdzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHc6dGhpcy55aChhKX0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpoOnRoaXMucHcoYSl9LHB3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xdzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnM6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkttOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFVhPWMudW98fFVhLFRjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLkRvKDQpOwooZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlpkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUyhiKTp0aGlzLmRhKCl9LHN0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGIsZz10aGlzLmZiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlpiJiYoMDw9Zy5pbmRleE9mKGQpfHxhLllkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwKKHRoaXMuWmQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxrYjpmdW5jdGlvbigpe3RoaXMuWmQrKztpZigxMDx0aGlzLlpkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuQWt8fFZhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5pYisrLDE1PHRoaXMuaWIpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7CmVsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCl9fSwKd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLldhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLktwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5zdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuemt8fFdhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSChhKXx8KHRoaXMuSihhKSwobmV3IFdhKGEsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBYYT1jLkJrfHxYYSxZYT0KbmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmtwPXRoaXMuYVszXTt0aGlzLmxoPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMucW49YjtiLnByb3RvdHlwZT17S3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxzOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBaYT1jLnFufHxaYSxVYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy5Lcyg0KTsoZnVuY3Rpb24oYyl7Yy5iaj0KcC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlAoYi5lbGVtZW50KTt0aGlzLlMoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxYYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgJGE9Yy5ianx8JGE7KGZ1bmN0aW9uKGMpe2MuYWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBhYj1jLmFqfHxhYjsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgJGEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGFiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYmI9Yy5janx8YmIsY2I9bmV3IGJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJpPXRoaXMuYVsxMF07dGhpcy5Ccj10aGlzLmFbOF07dGhpcy5abz10aGlzLmFbN107CnRoaXMuU3A9dGhpcy5hWzJdO3RoaXMubGo9dGhpcy5hWzFdO3RoaXMubmg9dGhpcy5hWzVdO3RoaXMuSHM9dGhpcy5hWzRdO3RoaXMuSWk9dGhpcy5hWzEwXTt0aGlzLk1yPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzldfWMuSXE9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJpOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ccjp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm86dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNwOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JaToKdGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1yOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgZGI9Yy5JcXx8ZGIsVmM9bmV3IGRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuQWkoNCk7KGZ1bmN0aW9uKGMpe2Mubmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuc2YoYiwiZWxlbWVudElEIik7dGhpcy5nZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PQpiLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5QKGcpO3RoaXMuUyhnKTt0aGlzLkZjPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5GYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRmMpfSxYYTpmdW5jdGlvbigpe3JldHVybiEwfSxLbzpmdW5jdGlvbigpe2UuTGYodGhpcy5GYyk7ZS5NZih0aGlzLkZjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sTWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgZWI9Yy5uanx8ZWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGZiPWMubWp8fGZiOyhmdW5jdGlvbihjKXtjLm9qPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLmlucmVhZCl7dmFyIGI9ay5pbnJlYWQsYT1lLnNmKGIsImVsZW1lbnRJRCIpO2UuTGYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMub2p8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuUHE9dGhpcy5hWzRdO3RoaXMuUHI9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcz1iO2IucHJvdG90eXBlPXtpbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuamw6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBxOnRoaXMuT3IoYSl9LE9yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qcjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGliPWMucHN8fGliLFdjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLmlsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sYnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxnbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuSWE9YTt0aGlzLm9mPXRoaXMuVGc9ITE7dGhpcy5hZz1kO3RoaXMud2c9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuSWE9bmV3IHooYSkpO3ZhciBlPXRoaXMuUGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTsKaWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLktkKHRoaXMuSWEudXJsKSYmbS5nZCl7dmFyIGg9bmV3IHooYS51cmwpO2guYnUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5nYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uZ2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLmlqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5vZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMud2c/dGhpcy5QYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLlBhLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVGd8fCh0aGlzLlBhLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5QYS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsmJmsudnBhaWQmJm0mJm0uUmModGhpcy5JYS51cmwpJiZ0aGlzLlBhLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuUGEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuUGEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5LZCh0aGlzLklhLnVybCk/bS5nZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLktkKHRoaXMuSWEudXJsKSx0aGlzLmFnJiZ0aGlzLmFnKCl9cmV0dXJuIHRoaXMuUGF9fX0pKGMpO3ZhciBqYj1jLmlqfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnhkPXRoaXMuZWI9bnVsbDt0aGlzLmJwPXRoaXMucGI9dGhpcy5UZj0hMTt0aGlzLnZhPSIiO3RoaXMuT2Y9ITE7dGhpcy5CYT10aGlzLk5jPSIiO3RoaXMuS2Y9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuZWU9ITE7dGhpcy5PYT1bXTt0aGlzLkNmPXRoaXMuRmI9IiI7dGhpcy5CZD0hMTt0aGlzLnJlPTA7dGhpcy5GZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkRlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuamM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucWI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMuc2U9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5IZD0hMTt0aGlzLk1vPXRoaXMuaGQ9bnVsbDt0aGlzLmxlPXRoaXMuaGM9dGhpcy5KZz10aGlzLnVlPXRoaXMuZ2Q9dGhpcy55ZD10aGlzLmxjPSExO3RoaXMuUmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuamo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5PYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdyZWdleDp0aGlzLnhkLGpzcG9wdXBzOnRoaXMuVGYsc2lkZWxvYWRzOnRoaXMucGIsZGlzYWJsZXRlc3RzOnRoaXMuYnAsaG9tYWRBbGlhczp0aGlzLnZhLAppc0luaXRpYWxpemVkOnRoaXMuT2YsZ2xvYmFsQ29uZmlnOnRoaXMuTmMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLktmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuQ2YsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5CZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5yZSxIT01BRF9WRVJJRklFRDp0aGlzLkZlLEhPTUFEX0JMT0NLRUQ6dGhpcy5EZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5qYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRWUsdGVzdEhpZGU6dGhpcy5IYix0ZXN0VGFnczp0aGlzLnFiLHRlc3RUYWdzSlM6dGhpcy5JYix0ZXN0Q29va2llOnRoaXMuR2IsdGhyb3R0bGU6dGhpcy5zZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTW8sCmFkQmxvY2tlckRldGVjdGVkOnRoaXMubGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnlkLHVzZVN0cmljdENoZWNrczp0aGlzLmdkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUmEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMub2csZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaGMsc2tpcEFsbG93ZWQ6dGhpcy5sZX19LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlJhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUmFbYl0mJjE9PXRoaXMuUmFbYl0mJihhPSEwKTtyZXR1cm4gYX0saWU6ZnVuY3Rpb24oYSl7dGhpcy5SYVthXT0hMH0sZXE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuUmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5SYVtiXSYmMT09dGhpcy5SYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxvZTpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT0KdHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5tbyhhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLlJjKGEpO2U9dGhpcy5NYShhKTtjPyh0aGlzLmFjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsaz1lLnBhdGguc3Vic3RyKDEpKTooaD0KdGhpcy5nZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmVifHx0aGlzLnhkKSYmKGs9dGhpcy5vcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sUmM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmFjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGFjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLlJjKGEpO3JldHVybiBifSxncTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudmEmJjA8dGhpcy52YS5sZW5ndGgpcmV0dXJuIHRoaXMudmE7Zm9yKGQgaW4gdGhpcy52YSlpZihiPXRoaXMudmFbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuenc7cmV0dXJuIm5vbmUifSxQYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMub2ddfSxnZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGMoKSxiPXRoaXMuc2coKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb3M6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3JldHVybiBhfSxjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5PZj0hMDt0aGlzLk5jPWE7dGhpcy5CYT1iO3RoaXMuZWU9ZDt0aGlzLmhkPWM7dGhpcy5EYz1lO3RoaXMuRWI9Cmh8fHt9O3RoaXMuWHIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5WcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWmE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFhyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk5jK3RoaXMucWMoImdsb2JhbCIpKSx0aGlzLnRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LFZyOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnFjKCJjbGllbnQiKSk7dGhpcy5HYShuZXcgeih0aGlzLkJhK3RoaXMucWMoImNsaWVudCIpKSx0aGlzLnljLmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5pZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMubGIoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnlkKXt0aGlzLnlkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9O3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlo9dGhpcy5LZj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuRGUpKTt0aGlzLnRiKCk7ZS5UYihsLm10KTsoYj1lLnlmKHRoaXMuUGMoKSkpfHwoYj1lLnlmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx0cTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQmF8fHRoaXMuRmJ8fHRoaXMudmF8fHRoaXMueWMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy52YT1hLmFsaWFzfHxudWxsO3RoaXMuQ2Y9YS5hZHBhdGh8fCIiO3RoaXMuQmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5vZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnZhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfSxUYzpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTtpZihhKXt2YXIgYj0KbmV3IHoodGhpcy5nZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucWMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLkh1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJjdXN0b21lciIpO2E/dGhpcy5mbD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLmZsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5UYyghMCl9LmJpbmQodGhpcyksITApfX0sSHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLmdkPQp0aGlzLkpiKGIuc3RyaWN0KTt0aGlzLnVlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuSmc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnFiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMueGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVGY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5wYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaGM7dGhpcy5sZT1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkdiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mCkFycmF5P3RoaXMub3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLkJkJiYodGhpcy5HYj1udWxsKTt0aGlzLnNlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuSGQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkhkPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZHYoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMucWJ8fHRoaXMuR2IpP3RoaXMuZWU/KHRoaXMub2E9dGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSksdGhpcy56ZCgpLHRoaXMudGIoKSk6dGhpcy5TdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlR1KCkpfX0sU3U6ZnVuY3Rpb24oKXt0aGlzLlJ1KCl9LFR1OmZ1bmN0aW9uKCl7dGhpcy5aPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSk7dGhpcy50YigpfSxmZDpmdW5jdGlvbihhKXt0aGlzLmxjPQohMDt0aGlzLlp8fCh0aGlzLlo9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMudGIoKSx0aGlzLnpkKCkpfSxSdTpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemcoKX1lbHNlIHRoaXMuemcoKX0seWc6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoKSk7dGhpcy5XdShmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmZkKHRoaXMuamMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnFiPW51bGwsdGhpcy5wZSgpfSxXdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5HYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmxiKCkpO3RoaXMuWHUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnlnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnlnKCl9LFh1OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0scGU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLnJlKyssdGhpcy5HYShuZXcgeih0aGlzLkdiKSx0aGlzLlF1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFlKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMueGcoKX0scWU6ZnVuY3Rpb24oYSl7dGhpcy5mZCh0aGlzLkVlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sUXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucmU/dGhpcy5wZSgpOnRoaXMucWUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy54ZygpOnRoaXMucWUoIkFBQSIpfSx4ZzpmdW5jdGlvbigpe3RoaXMuWj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy51YikpO3RoaXMudGIoKTt0aGlzLnpkKCl9LHRiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMubGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLkZlKSk7dGhpcy5oZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhkJiZ0aGlzLmhkKCl9LEpvOmZ1bmN0aW9uKCl7aWYodGhpcy51ZSYmdGhpcy5FcSgpKXt2YXIgYT10aGlzLmVxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxDZzpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT0KYS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxHYTpmdW5jdGlvbihhLGIsYyxmLGgsSWMpe2E9bmV3IGpiKGEsYixjKTtmJiYoYS5UZz0hMCk7aCYmZS5zcigpJiYoYS5vZj0hMCk7SWMmJihhLndnPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFZlOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLkxhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmdhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuYWMoKXx8KGE9dGhpcy5NYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZ2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxJbzpmdW5jdGlvbigpe3RoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuR2EoYSx0aGlzLnh2LmJpbmQodGhpcyksdGhpcy53di5iaW5kKHRoaXMpKX0seHY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5EcCgpfSx3djpmdW5jdGlvbigpe30sRHA6ZnVuY3Rpb24oKXtlLlRiKGwuQ3ApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5wYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnBiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLkxhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUTt3aW5kb3dbYy5ZYigpXT10aGlzO2UuTGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuc2V9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LHNnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGtiPWMuamp8fGtiLG09bmV3IGtiO3dpbmRvdy5Fdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml3PXRoaXMuYVs4XTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLkVoPXRoaXMuYVs0XTt0aGlzLkZrPXRoaXMuYVs5XTt0aGlzLmJ3PXRoaXMuYVs1XTt0aGlzLk9sPXRoaXMuYVs4XTt0aGlzLnVuPXRoaXMuYVs2XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuQ2w9YjtiLnByb3RvdHlwZT17aHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLml3OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllpOnRoaXMuRGgoYSl9LERoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRms6dGhpcy5hdyhhKX0sYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ3OnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5PbDp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudW46dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgbGI9Yy5DbHx8bGIsWGM9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuaHcoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiLGMpe3RoaXMuaj1hO2EudS5MP3RoaXMuTmE9YS51LkwoKTp0aGlzLk5hPSIiO3RoaXMuY29udGFpbmVyPXRoaXMuai5TYTt0aGlzLnBsYXllcj10aGlzLmoudTt0aGlzLnRjPSExO3RoaXMua289MUUzO3RoaXMuY2E9bnVsbDt0aGlzLlQ9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5lZD17fTt0aGlzLnJjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMucmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5qLnUpJiZ0aGlzLmoudS5CJiYoYT10aGlzLmoudS5CKCkpLHRoaXMucmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5kZD0hMTt0aGlzLldmPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToKMTU7dGhpcy5zPXt9O3RoaXMucGM9ITE7dGhpcy5GZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuVG89ZS5wYSgxMCk7dGhpcy5XYz1lLnBhKDEwKTt0aGlzLlVkPWUucGEoMTApO3RoaXMudGc9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUmI9dGhpcy5CYj0hMTt0aGlzLkNkPW51bGw7dGhpcy5DYz10aGlzLnVnPXRoaXMuY2c9dGhpcy5HYz10aGlzLmZ2PXRoaXMuYWI9ITF9Yy5kaj1iO2IucHJvdG90eXBlPXtwZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxEZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5GYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmxjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLAoiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQobC5abSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpfSxPZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuVC5aKXRoaXMuVC5KbygpLHRoaXMuVC5vYSYmdGhpcy5ULmlzRW5hYmxlZD8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlQuaGN9KSk6Yj8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULmhjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5zYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5PZChhLGIsYyl9LDUwKX19LCRkOmZ1bmN0aW9uKGEpe3RoaXMuR2M9ITE7dGhpcy5zPWE7dGhpcy5qdSh0aGlzLnMpO3RoaXMuemYoYSl9LAp6ZjpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5lZD10aGlzLnFxKGEpKSx0aGlzLnpmKGEucGFyZW50KSl9LHFxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5ZKXtiPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksCmUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5VYShiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuRWMmJmEuRWMuZXJyb3ImJmEuRWMuZXJyb3IuY29kZSYmKGI9YS5FYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmljLmNvZGU6Yj09Qy5tZC5jb2RlP2UuRChsLk92LHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk6KGUuUGQoKSxiPT1DLkllLmNvZGUmJmUuRChsLnlzLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpO2UuRChsLkJwLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5HZS5jb2RlOmUuRChsLnl2LAp0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguSmUuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLkQobC5Wdix0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4Lm5kLmNvZGU6ZS5EKGwuJHYsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmxkLmNvZGU6ZS5EKGwuenMsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09CmMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLnpiKGEpO3RoaXMuc2EoKX0semI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5OZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuWHc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLm1uJiZ0aGlzLnBsYXllci5KYygpJiYoYi52b2x1bWU9CnRoaXMucGxheWVyLkpjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuaG4oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkJnKGIpPyh0aGlzLmtuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5PbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuSmQoKT90aGlzLnJnKCk6dGhpcy5zLm9yaWdpbi5oZih4LmxkKX0saHU6ZnVuY3Rpb24oKXtlLlplKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkFlJiZlLmxuKHRoaXMucy5vcmlnaW4uQWUpO2UuJGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmouQzt0aGlzLmouQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5qLkMsYSk7dGhpcy5qLmRnKCk7dGhpcy5qLmVjKCk7Zm9yKGE9dGhpcy5qLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuai5lYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmouRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuc3EoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5qLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnphKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLnVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5zYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmdGhpcy5KdigpLCJBZFN0YXJ0ZWQiPT0KYS5kYXRhLm5hbWUmJnRoaXMuS3YoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk52KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk12KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx2KCkpfS5iaW5kKHRoaXMpKTtlLnVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLnNhKCl9LmJpbmQodGhpcykpO2UudWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5zYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmouZW4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKS3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sSnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS4kYSgiaW1wcmVzc2lvbiIpfSxRZzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS4kYSgic3RhcnQiKX0sUGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS4kYSgiZmlyc3RRdWFydGlsZSIpfSxOdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLiRhKCJ0aGlyZFF1YXJ0aWxlIil9LE12OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLiRhKCJjb21wbGV0ZSIpfSxMdjpmdW5jdGlvbigpe2UuJGEoImFkc3RvcHBlZCIpO3RoaXMuc2EoKX0saG46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5UO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5hYygpPyhmPWUuTWEoZiksYj1mLnByb3RvY29sKwoiOi8vIitmLmhvc3QpOmI9ZjtjLnNyYz1iLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuQXYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxCZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LGtuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLk9nLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sJGM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuT2cuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sT2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlby5jb250cm9scz0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksdGhpcy5rbyl9LHhlOmZ1bmN0aW9uKGEpe3RyeXtpZighZS5ZYSgpJiZ0aGlzLlQuSmcmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLnMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuVC5nYSgidmlkZW8tbm9vcCIpKTsKcmV0dXJufX1jYXRjaChiKXt9dGhpcy50Y3x8IXRoaXMuQmcodGhpcy52aWRlbyl8fHRoaXMuQmJ8fCh0aGlzLnRjPSEwLHRoaXMuenYoKSx0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHRoaXMuai5lYygpLHRoaXMuTGcoKSx0aGlzLk1nKCksdGhpcy5UZSgpLHRoaXMuai5kZygpLHRoaXMudmlkZW8ucGxheSYmdGhpcy5uZSgpKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy5DYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLk9jPVtdO2Zvcih2YXIgYj10aGlzLmouRyxjPTA7YzxiLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5PYy5wdXNoKGIuY2hpbGRyZW5bY10pLGIuY2hpbGRyZW5bY10uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLnJkKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5yZCgpfWVsc2UgdGhpcy5yZCgpfSxyZDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspdGhpcy5PY1thXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGE9dGhpcy52aWRlby5wbGF5KCkpJiZhWyJjYXRjaCJdKWFbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5zYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwiIiwhMCkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5lKCkpfS5iaW5kKHRoaXMpOwp0aGlzLnhmKCkucWcodGhpcyl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLkQobC5VbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMucy54Yj8odGhpcy50Yz0hMSx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZGQ9ITEsdGhpcy5qLkhnKCksdGhpcy5zLm9yaWdpbi5WZCgpKTp0aGlzLnNhKCl9LEF2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuJGModGhpcy52aWRlbyksdGhpcy5KZCgpPwp0aGlzLnJnKCk6dGhpcy5qZChhKSl9LGpkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuVmUoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZSgpKTt0aGlzLnMub3JpZ2luLmhmKHgubGQpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnYpdGhpcy5zYSgpO2Vsc2V7dGhpcy5aYj0hMDt0aGlzLmoudS5rYiYmIXRoaXMudWcmJnRoaXMuai51LmtiKCkmJmUuRChsLkFjLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLmt2KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5tZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50Zyk7YyYmKGI9dGhpcy5zLm1lLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5kZHx8KHRoaXMuZGQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGwuJG0sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTt0aGlzLnMueGI/KHRoaXMudGM9ITEsdGhpcy4kYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmRkPSExLHRoaXMuai5IZygpLHRoaXMucy5vcmlnaW4uVmQoKSk6dGhpcy5zYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5yYy5yZXBsYWNlKCJbdGltZV0iLGUucGYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMucGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHJnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5scSgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5lYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuTmcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuTGcoKTt0aGlzLk1nKCk7dGhpcy5DZD1zZXRJbnRlcnZhbCh0aGlzLkhvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sbHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZj1iPXRoaXMucy5NW2NdLGU7ZT1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLmFjKCkmJihlPWguTWEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKSG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLkNkKSx0aGlzLndlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMueWUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuQ2QpLHRoaXMuamQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmNnPSEwLHRoaXMuR2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxrdjpmdW5jdGlvbihhKXthPT10aGlzLkZnfHx0aGlzLkJifHwoMD09YSYmKHRoaXMuYWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYWIpLHRoaXMuYWI9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLkVnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5FZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5CYnx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUuRChsLldtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSksZS5EKGwuYW4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSx0aGlzLlJiJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5HYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChsLlZtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLkQobC5ZbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5EKGwuY24sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSksZS5EKGwuZG4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSwKdGhpcy5GZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5CYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnJxKHRoaXMucy5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmVkLmltcHJlc3Npb25zJiZlLnFyKGYudXJsLHRoaXMuZWQuaW1wcmVzc2lvbnMpP3RoaXMuTmQoZi51cmwsZi50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UuRChsLlhtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSx7YWRJZDp0aGlzLmVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5OZChmLnVybCxmLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy5BYT10aGlzLiRvKHRoaXMucy5BYSxhKSl9fSxOZDpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuS2EoYSksYyYmYS5nbihjKSxmfHwoZj10aGlzLmdmKSx0aGlzLlQuR2EoYSxmLHRoaXMuZ2YsITEsITApKX0scnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSwkbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx6djpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5OZy5iaW5kKHRoaXMpfSxOZzpmdW5jdGlvbigpe2UuRChsLk5vLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkdjJiZlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZS5acCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMueGN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnhjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucmMucmVwbGFjZSgiW3RpbWVdIixlLnBmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LE1nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Ubzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmJkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuV2M7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaHYuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlVkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ3YuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5WYi5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMudGc7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5tZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLmJkLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LlhhJiZ0aGlzLmoudS5YYSgpJiZ0aGlzLnVzKCk7dGhpcy5WYigpfX0sVmI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxiZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxodjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuV2MpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQobC5PZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sWWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLldjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuT2UsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5XYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sZ3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlVkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LHVzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LENiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYik7dGhpcy5DY3x8dGhpcy5wY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmUoKSl9LHNhOmZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkZhJiZ0aGlzLnBjfHwicG9zdHJvbGwiPT1lLkZhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5lYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5BZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLkFkKCl9ZWxzZSB0aGlzLkFkKCl9LEFkOmZ1bmN0aW9uKCl7dGhpcy51Zz0hMDt0aGlzLmouQmYoKTsKdGhpcy5qLk50KCk7dGhpcy5aYj0hMTtlLkQobC5Tbyx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMueGYoKS5LdCgpfSx4ZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxKZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51YSgibWluVmlzIik7YSYmKGUuTWYodGhpcy52aWRlbyxhKT90aGlzLk10KCk6dGhpcy5ZZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy54YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy54Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LGdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmRqfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs5XTt0aGlzLlN0PXRoaXMuYVsxMF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5QbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVszXX1jLlJzPWI7Yi5wcm90b3R5cGU9e1JrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tazp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlN0OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUG06dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5Sc3x8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuUmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5ZPW51bGw7dGhpcy5NYj0hMTt0aGlzLkFlPSIiO3RoaXMuemU9ITE7ZCYmZC5lbXB0eT90aGlzLiRyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmVtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ub2UodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuYWYodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5vZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5vZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KImNvbWFwcHNwb3RpbWEzdnBhaWQiKSxiLmRhdGEuaG9tYWRfY29tcGF0aWJsZV92cGFpZD0idHJ1ZSIpO20uR2EoYix0aGlzLlpyLmJpbmQodGhpcyksdGhpcy5Xci5iaW5kKHRoaXMpKX0scWY6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsKIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysKKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe31lbHNlIGMuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxacjpmdW5jdGlvbihhKXt0aGlzLkR0KGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4Lm5kKSl9dGhpcy5iYT0KdGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LCRyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkphfHwodGhpcy5KYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQ2EoeC5uZCkpfXRoaXMuYmE9dGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LFdyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguR2Use2RlcHRoOmF9KSl9LFVjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLnZyKCk/dGhpcy5ZdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFmKCksZyx7QWRTeXN0ZW06dGhpcy5YcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5mYSh0aGlzLkNhKHguSmUpKTooYT0wLHRoaXMudXYoKSYmdGhpcy4kZCh0aGlzLlVvKCkpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLk1iPyh0aGlzLk1iPTE8dGhpcy5iYS5sZW5ndGgsdGhpcy5iYS5sZW5ndGgmJnRoaXMuVWMoKSk6dGhpcy5wYXJlbnQuVmQoKX0sdXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WdSgpP3RoaXMuVXUoKT8hMDooLTEhPXRoaXMuVWIoKT90aGlzLmZhKHRoaXMuQ2EoeC5DZSkpOnRoaXMuZmEodGhpcy5DYSh4LmJpKSksITEpOih0aGlzLmZhKHRoaXMuQ2EoeC5pYyxDLkllKSksITEpfSwkZDpmdW5jdGlvbihhKXthLkFhPWEuQWEuY29uY2F0KHRoaXMuUmQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC4kZChhKX0sVW86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMudmYoKTthLnhjPXRoaXMuJHAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLldwKCk7YS5tZT10aGlzLnBxKGEuZHVyYXRpb24pOwpyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oYil7dGhpcy5ZJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguQ2UuY29kZT9iLkFhLmNvbmNhdCh0aGlzLmJxKCkpOmIuQWEuY29uY2F0KHRoaXMuanEoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuemImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC56YiYmdGhpcy5wYXJlbnQuemIoYiksYT0wLHRoaXMuVWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0saGY6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxWdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMudmYoKS5sZW5ndGh9LApVdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sRHQ6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLkFlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy56ZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2cjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQWYoKS5sZW5ndGh9LEFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FZCh0aGlzLlksIkFkU3lzdGVtIil9LFJkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxnLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuVWEoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxqcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxicTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCnZmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksdWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEN3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlVhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnVjKS1NYXRoLmFicyg3MDAtYi51Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS51YyktTWF0aC5hYnMoNzAwLWIudWMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZz1bXSxiPSExLGQ9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTWMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVWEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGV8fG0mJm0ubGUpdHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkF1KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToKIiJ9LE1jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlprPXRoaXMuYVs0XTt0aGlzLmd3PXRoaXMuYVs2XTt0aGlzLkRyPXRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbNV07dGhpcy5DdT10aGlzLmFbNl07dGhpcy5Taj10aGlzLmFbN107dGhpcy5xcD10aGlzLmFbNV07dGhpcy5Rcz10aGlzLmFbMTBdO3RoaXMuZz10aGlzLmFbMl19Yy5udj1iO2IucHJvdG90eXBlPXtZazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWms6dGhpcy5mdyhhKX0sZnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmd3OnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkRyOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NbDp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3U6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Tajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMubnZ8fHBiLFpjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLllrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMueGM9IiI7dGhpcy5PPQp0aGlzLnhiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Laz1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxzcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG5iPWMuS2t8fG5iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Wcz10aGlzLmFbOV07dGhpcy56cj10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzhdO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuams9YjtiLnByb3RvdHlwZT17aXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmp2OnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wczp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenI6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuQ20oYSl9LApDbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG06dGhpcy5JdShhKX0sSXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkp1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5qa3x8cWIsJGM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9JGMuaXYoNCk7dmFyIHg9e25kOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLGthOiJYTUxfUEFSU0VfRVJST1IifSxiaTp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsa2E6IkRVUkFUSU9OX0VSUk9SIn0saWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLAprYToiRU1QVFlfVkFTVCJ9LEplOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLGthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxHZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKa2E6IkxPQURfRVJST1IifSxsZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsa2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxydzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixrYToiTUVESUFGSUxFX0VSUk9SIn0sQ2U6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsa2E6IkRVTU1ZX0FEIn19LEM9e0hlOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsa2E6Ik5PX0FEUyJ9LEllOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixrYToiTk9fTUVESUFGSUxFUyJ9LHR3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixrYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG1kOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLGthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm51PXRoaXMuYVsxXTt0aGlzLlhzPXRoaXMuYVs0XTt0aGlzLmhsPXRoaXMuYVsxXTt0aGlzLk9qPXRoaXMuYVsxXTt0aGlzLnRvPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMuQ2g9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm51OnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaGw6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Pajp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcmI9Yy5DaHx8cmIsYWQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQubXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5FYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgb2I9Yy5MaXx8b2I7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU3I9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLkVpPQp0aGlzLmFbNF07dGhpcy5kbD10aGlzLmFbNF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5haD10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkxtPWI7Yi5wcm90b3R5cGU9e1JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNrOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5tcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWk6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbjp0aGlzLlZ0KGEpfSxWdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV3Q6dGhpcy4kZyhhKX0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTG18fHNiLGJkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuU2E9YS5yZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuVGE9e307dGhpcy5RZj0hMTt0aGlzLldiPVtdfWMuamk9YjtiLnByb3RvdHlwZT17bnE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMubnEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLm9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxHdTpmdW5jdGlvbigpe3RoaXMuUWY9ITB9LEhnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxkZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2UuRChsLkFjLHRoaXMudS5CKCkpfSxOdDpmdW5jdGlvbigpe3RoaXMuUWZ8fCh0aGlzLnUucGxheSgpLGUuRChsLkJjLHRoaXMudS5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlNhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5TYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlNhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuU2Eub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5TYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5TYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUucmYoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5EZi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sb3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGFxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sRGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hcSh0aGlzLlNhKTsKaWYoYi54IT10aGlzLlRhLnh8fGIueSE9dGhpcy5UYS55fHxiLnBvc2l0aW9uIT10aGlzLlRhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlRhLndpZHRofHxiLmhlaWdodCE9dGhpcy5UYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5UYS53aWR0aCYmMDx0aGlzLlRhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmYoKTtyZXR1cm59dGhpcy5UYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuV2IubGVuZ3RoO2ErKyl0aGlzLldiW2FdKHt3aWR0aDpiLndpZHRoLApoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLkRmLmJpbmQodGhpcyksMTApfSxlbjpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy5XYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuV2IucHVzaChhKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTj1jLmppfHxOLEI9W10sdGI9MDsxMDA+dGI7dGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRxPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVs5XTt0aGlzLnpxPXRoaXMuYVs2XTt0aGlzLkVuPXRoaXMuYVsxXTt0aGlzLlVyPXRoaXMuYVs5XTt0aGlzLnduPXRoaXMuYVsxXTt0aGlzLmJ0PXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLmlwPXRoaXMuYVs3XTt0aGlzLmdpPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuT3M9YjtiLnByb3RvdHlwZT17WnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRxOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLnlxKGEpfSx5cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenE6dGhpcy5EbihhKX0sCkRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVXI6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnduOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idDp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHY6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmlwOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5naTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMuT3N8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLlpxKDQpOyhmdW5jdGlvbihjKXtjLnVrPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMua2UoYik7dGhpcy5lZigpfSxrZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKa2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy51a3x8dmI7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7CnRoaXMud2I9dGhpcy53Ynx8ITE7dGhpcy5OZT10aGlzLlFlPXRoaXMuSGY9dGhpcy5pYT10aGlzLnRlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTHAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRlPSEwO3RoaXMuSGYmJnRoaXMuWWUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudmMoKTsKdGhpcy5IZj0hMDt0aGlzLlllKCl9LmJpbmQodGhpcykpO3RoaXMuVWUoKX0sWWU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy52YygpO2lmKCF0aGlzLnRlJiYhdGhpcy52YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudGUmJnRoaXMuTmUmJiF0aGlzLlFlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHdmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApVZTpmdW5jdGlvbigpe2lmKHRoaXMudmMoKSl7dmFyIGI9dGhpcy53ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlFlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuTmU9Yi55d310aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZSgpfS5iaW5kKHRoaXMpLDEwMCl9LEZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlN3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxrcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxMcDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpjKCl9LmJpbmQodGhpcyksMTAwKX0semM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5RYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmtxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCnRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk9rLkltLkdtP3dpbmRvdy5PTy5Pay5JbS5HbS53dyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cigpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMudmt8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQW89dGhpcy5hWzhdO3RoaXMua3I9dGhpcy5hWzhdO3RoaXMuTHU9dGhpcy5hWzNdO3RoaXMuUWs9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy52cz1iO2IucHJvdG90eXBlPXt6bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW86dGhpcy5qcihhKX0sanI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtyOnRoaXMuS3UoYSl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB6Yj1jLnZzfHx6YixkZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1kZC56byg0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMudmx8fFU7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkudGQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuSXMoYSl9LmJpbmQodGhpcykpO3kuRHEoKX0sSXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLnVsfHxWOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLlZjJiYoYj1lLmFwKGIsdGhpcy5WYykpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLAoiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGJbYV0pLGQ9bmV3IFUoaCksdGhpcy5IKGQpfHwodGhpcy5KKGQpLGY9bmV3IFYoZCx0aGlzLkEpLGYuYigpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sdGQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2JdfHwodGhpcy5hYVtiXT17fSk7dGhpcy5hYVtiXVthXXx8KHRoaXMuYWFbYl1bYV09W10pO3RoaXMuYWFbYl1bYV0ucHVzaChjKX0sWnU6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5hYXx8CnRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuYmN8fCh0aGlzLmJjPVtdKSx0aGlzLmJjLnB1c2goYiksdGhpcy5MdCgpJiYodGhpcy5sZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYwPHRoaXMuYWFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYV1bY11bZF0oYil9fSxEcTpmdW5jdGlvbigpe2lmKHRoaXMuYmMpZm9yKHZhciBiPTA7Yjx0aGlzLmJjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuYmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuYWFbY11bZF1bZl0oYSl9fSwKdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5adShiKX19KX0pKGMpO3ZhciBBYj1jLndsfHxBYix5PW5ldyBBYihxKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLmptPXRoaXMuYVsyXTt0aGlzLnFsPXRoaXMuYVs1XTt0aGlzLmxzPXRoaXMuYVszXTt0aGlzLmVvPXRoaXMuYVs0XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLktsPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJGk6CnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Rajp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFsOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sczp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW86dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51aTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLktsfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5GbCg0KTsoZnVuY3Rpb24oYyl7Yy5NaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPQohMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxrYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLk1ofHxDYjsoZnVuY3Rpb24oYyl7Yy5OaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucXR8fCh0aGlzLnF0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5OaHx8RGI7KGZ1bmN0aW9uKGMpe2MuT2g9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLAp0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy55YSlpZihhPT10aGlzLnlhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5PaHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs2XTt0aGlzLmFpPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzhdfWMubWs9YjtiLnByb3RvdHlwZT17dWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZoOnRoaXMuJGgoYSl9LCRoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5haTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdiPWMubWt8fApHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5sbT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEhiPWMubG18fEhiOyhmdW5jdGlvbihjKXtjLmttPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuU2V8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLlZwfHwodGhpcy5JZigpLAp0aGlzLlZwPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLlNlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5TZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxZcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sSWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLllwKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5pYT0hMCx0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLm8oKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZigpfS5iaW5kKHRoaXMpLDUwKX0sUXc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSGIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBJYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEpiPWMubW18fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SaD10aGlzLmFbMV07dGhpcy5ydT10aGlzLmFbNF07dGhpcy5oaD10aGlzLmFbOF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5waD10aGlzLmFbNF07dGhpcy5xaz10aGlzLmFbOV07dGhpcy56dT10aGlzLmFbOF07dGhpcy55bj10aGlzLmFbNl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5lcj10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e1FoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUmg6dGhpcy5xdShhKX0scXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ1OnRoaXMuZ2goYSl9LGdoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5oaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU246dGhpcy5vaChhKX0sCm9oOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5waDp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucWs6dGhpcy55dShhKX0seXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnp1OnRoaXMueG4oYSl9LHhuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bjp0aGlzLm53KGEpfSxudzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub3c6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgTGI9Yy5Obnx8TGIsZ2Q9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuUWgoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXIoInBsYXllclBsYXlFbmQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5bGlzdFBsYXlOZXh0IixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuRGp8fE1iOyhmdW5jdGlvbihjKXtjLkNqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IixmdW5jdGlvbigpe3RoaXMubmYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm5mKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLmJuKCl9LmJpbmQodGhpcykpLHRoaXMuU2c9ITEsdGhpcy5Sdj0xRTMsdGhpcy5mZz17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG5mOmZ1bmN0aW9uKCl7dGhpcy5mZy5kb25lfHwodGhpcy5mZy5kb25lPSEwLHRoaXMuU2c9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksdGhpcy5SdikpfSxibjpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5TZyk7dGhpcy5tKCl9LFJnOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksdGhpcy53KCkpfSx0ZjpmdW5jdGlvbihiKXt2YXIgYT1bXTtpZihiKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJmJbY11bZF0mJmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZj1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7CmEucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLnRmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMudGYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwO3JldHVybiExfX0pfSkoYyk7dmFyIE5iPWMuQ2p8fE5iOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj0KbnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjJiYoYz1uZXcgTWIoYyksdGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgTmIoYyx0aGlzLkEpKS5iKCkpKX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2I9Yy5Fanx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNzPXRoaXMuYVs1XTsKdGhpcy54aj10aGlzLmFbMl07dGhpcy5tdj10aGlzLmFbMl07dGhpcy56aj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5CaD10aGlzLmFbMV07dGhpcy5ybz10aGlzLmFbOF07dGhpcy5RaT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLlFuPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dczp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueGo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm12OnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuemo6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktuOnRoaXMuQWgoYSl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CaDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm86dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5RaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIFFiPWMuUW58fFFiLGhkPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLkJzKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgUmI9Yy5zbHx8UmI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5MZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGQoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLAoiSU1BIiksdGhpcy5vKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTApfSxMZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5ybHx8U2I7KGZ1bmN0aW9uKGMpe2MudGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgUmIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFNiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBUYj1jLnRsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzhdO3RoaXMuQm09dGhpcy5hWzddO3RoaXMucWo9dGhpcy5hWzEwXTt0aGlzLmR0PXRoaXMuYVsxXTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVs4XTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLk51PQp0aGlzLmFbMl07dGhpcy5nPXRoaXMuYVs3XX1jLkpzPWI7Yi5wcm90b3R5cGU9e0J2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLkFtKGEpfSxBbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJtOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xajp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHQ6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RcDp0aGlzLm92KGEpfSxvdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnB2OnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5GbTp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHA6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk51OnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFZiPWMuSnN8fFZiLGlkPW5ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkJ2KDQpOyhmdW5jdGlvbihjKXtjLmFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5QKGIpO3RoaXMuUyhiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmFlPSExfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy50dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpOwpiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LER1OmZ1bmN0aW9uKCl7dGhpcy5hZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFdiPWMuYWx8fFdiOyhmdW5jdGlvbihjKXtjLiRrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5LYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5qcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuS2J8fCh0aGlzLktiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLktifHx0aGlzLktiKyssdGhpcy5LYjw9dGhpcy5qcz8odGhpcy5LYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKX0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRHUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFhiPWMuJGt8fFhiOyhmdW5jdGlvbihjKXtjLmJsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBXYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBYYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFliPWMuYmx8fFliLFpiPW5ldyBZYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5waT10aGlzLmFbOV07dGhpcy5wdT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkRzPWI7Yi5wcm90b3R5cGU9e29pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5waTp0aGlzLm91KGEpfSxvdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucHU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOgphfX19KShjKTt2YXIgJGI9Yy5Ec3x8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQub2koNCk7KGZ1bmN0aW9uKGMpe2MuV2s9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy5Xa3x8YWM7KGZ1bmN0aW9uKGMpe2MuVms9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRGEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMub2IoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5QbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkxjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5OcigpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxQbzpmdW5jdGlvbigpe3RoaXMuTWUoKXx8dGhpcy5vKCEwKX0sTnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7IWIubWEmJgpiLmJhJiZiLnZ3JiZiLnh3JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmcpZm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkRhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PQphJiYodGhpcy5iZz1iW2NdKTtyZXR1cm4gdGhpcy5iZ30sTGQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuTGMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKTp0aGlzLncoKTp0aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmM9Yy5Wa3x8YmM7KGZ1bmN0aW9uKGMpe2MuWGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5wbGF5ZXJhcGkpe3ZhciBiPWsucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgYWMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBjYz1jLlhrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzJdO3RoaXMucnY9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy5vbD1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZwOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HaTp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3I6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm5sOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucnY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLm9sfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5FcCg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApwYXVzZTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJgoodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9Yy5aanx8VzsoZnVuY3Rpb24oYyl7Yy5Zaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5iZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLmJlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuYmUmJmIhPXRoaXMuYmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5VdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWD1jLllqfHxYOyhmdW5jdGlvbihjKXtjLiRqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBXKGIpLGIuamE/dGhpcy5sZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBYKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCxmYz1jLiRqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5wYi5sZW5ndGgpe3ZhciBhPW0ucGIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuVmYuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlZmKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudHY9dGhpcy5hWzJdO3RoaXMuZXM9dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzZdO3RoaXMuUHU9dGhpcy5hWzJdO3RoaXMuQXA9dGhpcy5hWzZdO3RoaXMuc2k9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbN119Yy55cD1iO2IucHJvdG90eXBlPXtzdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVzOnRoaXMuYnYoYSl9LGJ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5jdjp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlB1OnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcDp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc2k6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLnlwfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5zdig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUChhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYz8odGhpcy5TKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy54cz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sWHQ6ZnVuY3Rpb24oYil7dGhpcy5xZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54c30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLnFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5xZCYmKG5ldyBHKHRoaXMsdGhpcy5xZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLklsfHxNOyhmdW5jdGlvbihjKXtjLkhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5EZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJgp3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLmd1KCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwKMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLGEpKTpiLmwoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEc9Yy5IbHx8RzsoZnVuY3Rpb24oYyl7Yy5KbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy54YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkgoYil8fAoodGhpcy5KKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYi5YdCh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgaWM9Yy5KbHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaD10aGlzLmFbOV07dGhpcy4kbD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5ncz10aGlzLmFbMl07dGhpcy5maD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLm5vPWI7Yi5wcm90b3R5cGU9e0toOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaDp0aGlzLlpsKGEpfSxabDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56aTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdzOnRoaXMuZWgoYSl9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5maDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPQpjLm5vfHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5LaCg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5iZj0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5TKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iZn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksCjQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuYmY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3lvOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5Vanx8bGM7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWXc6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQmUobmV3IGZ1bmN0aW9uKCl7fSk7CmEuc3c9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuRnQoYSk7d2luZG93LkF3PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0fHwodGhpcy5FdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLklkfHwodGhpcy5JZD0xKTtpZigyMDx0aGlzLklkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTsKcmV0dXJufXRoaXMuSWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTsKd2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT0KdHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0saGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMuVGp8fG1jOyhmdW5jdGlvbihjKXtjLlZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgbmM9Yy5Wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5zPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzhdfWMubnQ9YjtiLnByb3RvdHlwZT17TXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5zOnRoaXMud3EoYSl9LHdxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLm50fHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Ncyg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpO2EmJnRoaXMuUChhLnBhcmVudE5vZGUpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpOwp2YXIgWT1jLkxqfHxZOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkVmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5XYT10aGlzLnNjPSExO3RoaXMuamc9ZS5sYigxMCk7dGhpcy5OZigpfSxOZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuSGEoKSwhMDt0aGlzLkVmKys7aWYoMTA8dGhpcy5FZil0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5vKCEwKToKdGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLAoyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5Lanx8WjsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYKKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5xPXRoaXMuYVsyXTt0aGlzLktxPXRoaXMuYVs0XTt0aGlzLnNuPXRoaXMuYVsxXTt0aGlzLlVrPXRoaXMuYVsxXTt0aGlzLlB0PXRoaXMuYVs4XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNF07dGhpcy5hdj10aGlzLmFbMTBdO3RoaXMuem09dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNl19Yy5Hcj1iO2IucHJvdG90eXBlPXtNcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk5xOnRoaXMuSnEoYSl9LEpxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LcTp0aGlzLnJuKGEpfSxybjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLnNuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWs6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnZvKGEpfSx2bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud286dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmF2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56bTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMuR3J8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLk1xKDQpOyhmdW5jdGlvbihjKXtjLk5pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5QKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5OaXx8dGM7KGZ1bmN0aW9uKGMpe2MuTWk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksCnRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5NaXx8dWM7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRWEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7CmVsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgdmM9Yy5PaXx8dmMsd2M9bmV3IHZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVszXTt0aGlzLkN0PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVs0XTt0aGlzLlZxPXRoaXMuYVszXTt0aGlzLlp2PXRoaXMuYVs1XTt0aGlzLmJtPXRoaXMuYVsyXTt0aGlzLlhvPXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuSGo9YjtiLnByb3RvdHlwZT17U3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DdDp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSms6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMuWXYoYSl9LApZdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWnY6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ibTp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhvOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ZcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHhjPWMuSGp8fHhjLHBkPW5ldyB4YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXBkLlNxKDQpOyhmdW5jdGlvbihjKXtjLlVpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuUChiKSx0aGlzLlMoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciB5Yz1jLlVpfHx5YzsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5XZSgpfSxXZTpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2UoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIHpjPWMuVGl8fHpjOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIuamEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5IKGIpKXt0aGlzLkooYik7KG5ldyB6YyhiLHRoaXMuQSkpLmIoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIEFjPWMuVml8fEFjLEJjPW5ldyBBYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbOV07dGhpcy5Dbj10aGlzLmFbNl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs5XX1jLkdoPWI7Yi5wcm90b3R5cGU9CntYbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW46dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlV0OnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLkJuKGEpfSxCbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ246dGhpcy5pbyhhKX0saW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5HaHx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuWG4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUGY9dGhpcy5TZj10aGlzLlJmPSExO3RoaXMuWGM9W107dGhpcy5mZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT0KdHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRhP251bGw6VGEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBZYT9udWxsOllhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLApiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgY2I/bnVsbDpjYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaGI/bnVsbDpoYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE9hP251bGw6T2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHBhP251bGw6cGF9fWMuTWs9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5tcShhKTpbXSxiO3RoaXMuU2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuUmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMubWcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmZlKXtpZih0aGlzLlBmKWJyZWFrO2I9dGhpcy5mZVtjXTt0aGlzLnZlKGIpJiYodGhpcy5YYy5wdXNoKGIpLHRoaXMubWcoYikpfX0sdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxtcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5mZVtjXSx0aGlzLnZlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEpe3RoaXMudmUoYSkmJmEuYigpfSxGdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YKcCYmIXRoaXMuUmYpZm9yKHRoaXMuUGY9ITAsYT0wO2E8dGhpcy5YYy5sZW5ndGg7YSsrKXRoaXMuWGNbYV0uc2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5YY1thXS5zYil9fX0pKGMpO3ZhciBEYz1jLk1rfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YZz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLldpPWI7Yi5wcm90b3R5cGU9e1dnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLldpfHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5XZyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuVGIobC52diksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuVGIobC5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTsKdmFyIHNkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZWE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IFEsaz0hMTtGLlliKCk7Ri5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuWWIoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkpmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5ZYigpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxGLmxyKCkse2lkOnRkfSl9LDUwMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dT10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbMTBdO3RoaXMuVW49dGhpcy5hWzVdOwp0aGlzLnlrPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzddfWMuSHE9YjtiLnByb3RvdHlwZT17c3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnR1OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TaTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQmo6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlVuOnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLkhxfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC5zdSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuaGc9dGhpcy5jb25mPXRoaXMuVmE9CnRoaXMucGxheWVyPW51bGw7dGhpcy5TYz0wO3RoaXMuTmE9IiI7dGhpcy5ZYz1bXTt0aGlzLlpjPTA7dGhpcy5pZz0hMTt0aGlzLmNlPVtdfWMuVWc9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5oZz1hfSxhZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuTmE9dGhpcy5wbGF5ZXIuTCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFp0OmZ1bmN0aW9uKGEpe3RoaXMuVmE9YX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuTGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLlZhKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMubXIoKSl0aGlzLlZhLmModGhpcy5WYS5OYyx0aGlzLlZhLkJhLHRoaXMuVmEuZWUsZnVuY3Rpb24oKXt0aGlzLmRjKGEsYil9LmJpbmQodGhpcyksdGhpcy5WYS5EYyk7ZWxzZSBpZih0aGlzLkZxKCkpdGhpcy5RdChmdW5jdGlvbigpe3RoaXMuZGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChsLkFjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkd1KCk7ay5leGl0RnVsbHNjcmVlbigpO1I9az1uZXcgTyhrLAp0aGlzLlZhLGgpO2sucGcodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX1hPXRoaXMuaHMoYSk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk1kJiYoYz10aGlzLnBsYXllci5NZCgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5PZChhLGMsZik7dGhpcy5wbGF5ZXIucWcoayl9fSxtcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlNjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuU2MuZ2V0VGltZSgpLHRoaXMuU2M9YSwzRTU8Yj8hMDohMTt0aGlzLlNjPWE7cmV0dXJuITF9LHZ1OmZ1bmN0aW9uKCl7ZS5qZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudWEoImFkVGFnIik7dGhpcy51YSgicHJlcm9sbEFkVGFnIikmJgooYT10aGlzLnVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5qZihhKSk/dGhpcy5kYyhhKTooc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX0sdXU6ZnVuY3Rpb24oYSl7ZS5qZSgicG9zdHJvbGwiKTtpZighdGhpcy5oZyl7dGhpcy5kdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZihjKSk/dGhpcy5kYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKSl9fSxqZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9CmEoYil9cmV0dXJuIGF9LEh0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaXUodGhpcy51dS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5lYSgpfSxjZDpmdW5jdGlvbihhKXtlLmplKCJtaWRyb2xsIik7aWYoIXRoaXMuWGYpe3RoaXMuWGY9ITA7dmFyIGI9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy51YSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuZGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGY9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX19LEd0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5TZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy52dSgpO3RoaXMucGxheWVyLlNkJiZ0aGlzLkd0KCk7dGhpcy5IdCgpfSxJdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5ZYy5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLlpjPXRoaXMuWWMubGVuZ3RofSxGcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5aYyYmKGE9ITApO3JldHVybiBhfSxRdDpmdW5jdGlvbihhKXt0aGlzLmlnPWE7Zm9yKGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdWyJmdW5jdGlvbiJdKHRoaXMud3QuYmluZCh0aGlzKSl9LHd0OmZ1bmN0aW9uKGEpe3RoaXMuWmMtLTthJiZ0aGlzLmNlLnB1c2goYSk7MD49dGhpcy5aYyYmdGhpcy5pZygpfSxoczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5jZS5sZW5ndGg7YysrKWI9CnRoaXMuY2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuVWd8fGdhLFI9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnI9dGhpcy5hWzEwXTt0aGlzLm9wPXRoaXMuYVszXTt0aGlzLnJoPXRoaXMuYVs2XTt0aGlzLmRtPXRoaXMuYVs2XTt0aGlzLmx1PXRoaXMuYVszXTt0aGlzLnB0PXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVsxMF07dGhpcy5obz10aGlzLmFbMTBdO3RoaXMuUm09dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzhdfWMudmk9YjtiLnByb3RvdHlwZT17YXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJyOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5xaChhKX0scWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJoOnRoaXMuY20oYSl9LApjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmRtOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sdTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHQ6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRoOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYz1jLnZpfHxHYyx2ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj12ZC5hcig0KX0pLmNhbGwobmFlR2hhaVRFaWtlaXNpZSxuYWVHaGFpVEVpa2Vpc2llKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a

Request headers

Pragma
no-cache
Origin
https://www.chip.de
Accept-Encoding
gzip, deflate
Host
filestorage.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
Last-Modified
Thu, 06 Sep 2018 12:02:18 GMT
Server
Apache
ETag
"bdd1fe062d58c3e9d9216922f317755d:1536235338"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
*
Content-Length
183
160x600
ad.yieldlab.net/d/27572/21691/ Frame 976F
477 B
1 KB
Script
General
Full URL
https://ad.yieldlab.net/d/27572/21691/160x600?ts=1536589718190&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
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
538a73bb19a5c8a68c4c3ff31b01cc2150656c23c4f77316ddee1b2deb36c103

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 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
311
Expires
Sun, 09 Sep 2018 14:28:38 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180904/r20110914/activeview/ Frame 976F
73 KB
27 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180904/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d9262cbf7f04dd3b4ba9b73a11cbd614a1e707f22317611aac9d294b20a85103
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 04 Sep 2018 18:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
502472
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
27233
x-xss-protection
1; mode=block
server
cafe
etag
12076525581148098716
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 18 Sep 2018 18:54:06 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 976F
0
128 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvLeKJC4-A3mNHaFkTWQwsZQB2LRjmhnsiSnQbp_baqdJ1MpY7kFkxaCuiytKbWU_CjDVyY-S9HqhVI78AVIOFLs2x3ZJvQWkZxEkboRwI5a_uUPl4GLFY7NXJYjH3b88RtlRmdYTkFycbyTUQBABHS8aYrJlI6RJiPheS_YCUG22rFb1YWrnJx47wK0rYmrMTDgB38FU4y_o5iVA25RACXZMwe0rHUqirh_Yj3dR53hz_uIT370qnlRLdCnIhtZNWGam1Wn4I8pzUkZAcodPCA&sai=AMfl-YSot5DvQ4fhSQRn_lGxt7GLO71tq-pSozn-I2-X-ZSffjN5FeeqwqVfUuvtPxlcihKe1uMfF011hRl_DPmFD8wAPab6NVPeCitC8wpb&sig=Cg0ArKJSzL9NMZlo6upBEAE&urlfix=1&adurl=
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 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
Mon, 10 Sep 2018 14:28:38 GMT
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?ssp=1
  • https://ad.yieldlab.net/m?dt_id=15233&ext_id=6599602586195195927
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=15233&ext_id=6599602586195195927
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=15233&ext_id=6599602586195195927
Date
Mon, 10 Sep 2018 14:28:38 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
usermatch.gif
beacon.krxd.net/ Frame 740A
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fbeacon.krxd.net%2Fusermatch.gif%3Fpartner%3Dactiveagent%26partner_uid%3D%25%25COOKIE%25%25
  • https://beacon.krxd.net/usermatch.gif?partner=activeagent&partner_uid=6599602586195195927
0
453 B
Image
General
Full URL
https://beacon.krxd.net/usermatch.gif?partner=activeagent&partner_uid=6599602586195195927
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.137.126.71 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-46-137-126-71.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Cache-Control
private, no-cache, no-store
X-Request-Time
D=33 t=1536589718
Connection
keep-alive
P3P
policyref="https://cdn.krxd.net/kruxcontent/p3p.xml", CP="NON DSP COR NID OUR DEL SAM OTR UNR COM NAV INT DEM CNT STA PRE LOC OTC"
X-Served-By
beacon-n023-dub.krxd.net

Redirect headers

Location
https://beacon.krxd.net/usermatch.gif?partner=activeagent&partner_uid=6599602586195195927
Date
Mon, 10 Sep 2018 14:28:38 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/817/i/ Frame 740A
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?dmp=1&xxx=817
  • https://dmp.theadex.com/d/817/i/2.gif?c=&axd_pid=14&axd_fuid=6599602586195195927
43 B
731 B
Image
General
Full URL
https://dmp.theadex.com/d/817/i/2.gif?c=&axd_pid=14&axd_fuid=6599602586195195927
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
85.114.144.106 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
Last-Modified
Mon, 10 Sep 2018 14:28:38 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

Location
https://dmp.theadex.com/d/817/i/2.gif?c=&axd_pid=14&axd_fuid=6599602586195195927
Date
Mon, 10 Sep 2018 14:28:38 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
match
ps.eyeota.net/ Frame 740A
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fuip.semasio.net%2Fadition%2F1%2Finfo%3FsType%3Dsync%26sExtCookieId%3D%25%25COOKIE%25%25%26sInitiator%3Dyl
  • https://uip.semasio.net/adition/1/info?sType=sync&sExtCookieId=6599602586195195927&sInitiator=yl
  • https://uip.semasio.net/adition/1/info2?sType=sync&sExtCookieId=6599602586195195927&sInitiator=yl
  • https://ib.adnxs.com/getuid?https://uip.semasio.net/appnexusdata/1/info?stype=sync&sExtCookieId=$UID&sInitiator=internal
  • https://uip.semasio.net/appnexusdata/1/info?stype=sync&sExtCookieId=2729869184897373167&sInitiator=internal
  • https://ps.eyeota.net/match?uid=78F7E456BB6AB7E&pid=n4om0kv&r=https://uip.semasio.net/eyeota/1/info?sType=sync&sExtCookieId={UUID}&sInitiator=internal
0
140 B
Image
General
Full URL
https://ps.eyeota.net/match?uid=78F7E456BB6AB7E&pid=n4om0kv&r=https://uip.semasio.net/eyeota/1/info?sType=sync&sExtCookieId={UUID}&sInitiator=internal
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
35.157.25.10 Frankfurt, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-157-25-10.eu-central-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Cache-control
private
Content-Length
0

Redirect headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Frontend-ID
1
Location
https://ps.eyeota.net/match?uid=78F7E456BB6AB7E&pid=n4om0kv&r=https://uip.semasio.net/eyeota/1/info?sType=sync&sExtCookieId={UUID}&sInitiator=internal
P3P
policyref="http://uip.semasio.net/w3c/p3p.xml", CP="NOI PSAa PSDa OUR IND UNI CNT"
Access-Control-Allow-Origin
*
UIP-Response-Status
Ok
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Length
0
Routing-Server-ID
1
Expires
Sat, 01 Jan 2011 12:00:00 GMT
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://cm.g.doubleclick.net/pixel?google_nid=yieldlab&google_cm&google_sc
  • https://ad.yieldlab.net/m?dt_id=52&ext_id=CAESEE_k6kz5QtigzuBFyzJrrDM&google_cver=1
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=52&ext_id=CAESEE_k6kz5QtigzuBFyzJrrDM&google_cver=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:38 GMT
server
HTTP server (unknown)
status
302
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
location
https://ad.yieldlab.net/m?dt_id=52&ext_id=CAESEE_k6kz5QtigzuBFyzJrrDM&google_cver=1
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
288
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://match.adsrvr.org/track/cmf/generic?ttd_pid=yieldlab&ttd_tpi=1
  • https://match.adsrvr.org/track/cmb/generic?ttd_pid=yieldlab&ttd_tpi=1
  • https://ad.yieldlab.net/m?dt_id=99739&ext_id=e53b0dd6-bfa8-4cdc-b343-a84181ab2a41
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=99739&ext_id=e53b0dd6-bfa8-4cdc-b343-a84181ab2a41
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:38 GMT
x-aspnet-version
4.0.30319
status
302
p3p
CP="NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV"
location
https://ad.yieldlab.net/m?dt_id=99739&ext_id=e53b0dd6-bfa8-4cdc-b343-a84181ab2a41
cache-control
private,no-cache, must-revalidate
content-type
text/html
content-length
193
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://ib.adnxs.com/getuid?https://ad.yieldlab.net/m?dt_id=140420&ext_id=$UID
  • https://ad.yieldlab.net/m?dt_id=140420&ext_id=2729869184897373167
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=140420&ext_id=2729869184897373167
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:40 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 309.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.107:80
AN-X-Request-Uuid
558ecb68-143f-4213-bc37-dd0f48c2d2ff
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Location
https://ad.yieldlab.net/m?dt_id=140420&ext_id=2729869184897373167
Cache-Control
no-store, no-cache, private
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://c1.adform.net/serving/cookie/match?party=6
  • https://c1.adform.net/serving/cookie/match?CC=1&party=6
  • https://ad.yieldlab.net/m?dt_id=4879&ext_id=682417499596931646
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=4879&ext_id=682417499596931646
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:39 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:39 GMT

Redirect headers

status
302
date
Mon, 10 Sep 2018 14:28:38 GMT
server
nginx
access-control-allow-origin
*
content-length
0
location
https://ad.yieldlab.net/m?dt_id=4879&ext_id=682417499596931646
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=yieldlab
  • https://x.bidswitch.net/ul_cb/sync?ssp=yieldlab
  • https://sync.mathtag.com/sync/img?mt_exid=46&redir=%2F%2Fx.bidswitch.net%2Fsync%3Fdsp_id%3D80%26user_id%3D%5BUUID%5D%26expires%3D30%26ssp%3Dyieldlab%26bsw_param%3D89c4f792-b13a-4afc-82ea-12dbadc8991c
  • https://x.bidswitch.net/sync?dsp_id=80&user_id=c7b85b96-7ae7-4500-8e79-709e7bf9e0f1&expires=30&ssp=yieldlab&bsw_param=89c4f792-b13a-4afc-82ea-12dbadc8991c
  • https://ad.yieldlab.net/m?dt_id=6850&ext_id=89c4f792-b13a-4afc-82ea-12dbadc8991c
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=6850&ext_id=89c4f792-b13a-4afc-82ea-12dbadc8991c
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
Server
nginx/1.12.0
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
Location
//ad.yieldlab.net/m?dt_id=6850&ext_id=89c4f792-b13a-4afc-82ea-12dbadc8991c
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Keep-Alive
timeout=10
Content-Length
0
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://p.rfihub.com/cm?pub=19593&in=1
  • https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1040683376445288901
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1040683376445288901
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1040683376445288901
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Server
Jetty(9.0.6.v20130930)
Content-Length
0
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
m
ad.yieldlab.net/ Frame 740A
Redirect Chain
  • https://sync.mathtag.com/sync/img?mt_exid=118&redir=https%3A%2F%2Fad.yieldlab.net%2Fm%3Fdt_id%3D6061522%26ext_id%3D%5BMM_UUID%5D
  • https://sync.mathtag.com/sync/img?mt_exid=118&redir=https%3A%2F%2Fad.yieldlab.net%2Fm%3Fdt_id%3D6061522%26ext_id%3D%5BMM_UUID%5D&mm_bnc&mm_bct
  • https://ad.yieldlab.net/m?dt_id=6061522&ext_id=c7b85b96-7ae7-4500-8e79-709e7bf9e0f1
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=6061522&ext_id=c7b85b96-7ae7-4500-8e79-709e7bf9e0f1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT

Redirect headers

Date
Mon, 10 Sep 2018 14:28:38 GMT
Server
MT3 1.26.12.0 f85fe72 RELEASE cdg-pixel-x4
P3P
CP="NOI DSP COR NID CURa ADMa DEVa PSAa PSDa OUR BUS COM INT OTC PUR STA"
location
https://ad.yieldlab.net/m?dt_id=6061522&ext_id=c7b85b96-7ae7-4500-8e79-709e7bf9e0f1
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Keep-Alive
timeout=360
Content-Length
0
Expires
Mon, 10 Sep 2018 14:28:37 GMT
jsapi
s.d.adup-tech.com/ Frame 740A
37 KB
12 KB
Script
General
Full URL
https://s.d.adup-tech.com/jsapi
Requested by
Host: s.d.adup-tech.com
URL: https://s.d.adup-tech.com/ads/display.js?p=69139504101a193487ed1eb4af979f65
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.113 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-113.fra53.r.cloudfront.net
Software
nginx /
Resource Hash
8778ba53b998ae44cb9a271b72c299b2bf539ac1b33ca360e7bc10253698b850

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 12:37:49 GMT
content-encoding
gzip
last-modified
Mon, 10 Sep 2018 11:53:38 GMT
server
nginx
age
3049
etag
3fcf5eeb08ed0cd46045b73bef6d0b84
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
max-age=3600
x-amz-cf-id
u4dk31X-5uuhkKoUF6vmROgLrnq7vNdMe97NvA7rfGqh6LEtOUtKVw==
via
1.1 1015c68f2d8c45924ae7198c984dcdde.cloudfront.net (CloudFront)
expires
Mon, 10 Sep 2018 13:37:49 GMT
truncated
/ Frame 740A
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
1da1aacdf32c1154fda77c584f419812f8e0e24982786ea014ae44b85fe7bddb

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
ads
securepubads.g.doubleclick.net/gampad/
9 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1144401803364650&correlator=545247416422495&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fifs&adsid=NT&json_a=1&eid=22334400%2C21061459&vrg=246&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu_parts=3673%2Cchip_digital%2Cdownloads%2Cmacos%2Cartikel&enc_prev_ius=%2F0%2F1%2F2%2F3%2F4&prev_iu_szs=320x50%7C468x200&fluid=height&prev_scp=tfs_usr%3D1%26tile%3D5%26site%3Dchip_digital%26res%3Ddownloads%26rub%3Dmacos%26lay%3Dc1_downloads%26tgrp%3D3%26aem%3Dinf%26skv%3D1%26tfww%3D78910111213141516%26tfwiw%3D1600%26tfwih%3D1200%26kw%3Dnone%2Cnativeca%26pid%3D13725907%26uid%3DOpo9UIvNFs1XGERHQOc5BgwMAhy3rKp7%26wfxtg%3D842%2C848%2C854%2C876%2C877%2C878%2C959%2C960%26wfxtg_0%3D842%2C843%2C848%2C877%2C878%2C959%2C960%26wfxtg_1%3D842%2C843%2C844%2C846%2C848%2C878%2C959%2C960%26wfxtg_2%3D844%2C846%2C878%26hb_f%3Dfsb200%26hb_p%3D11%26hb_c%3D90795%26hb_v%3Dyieldlab%26hb_id%3DRxux0ex3bGYYLTGY%26emqrtt%3Dnone%26rl_seq%3D1%26sm%3Dd%2Ct5%2Cr0%2Cdis%2Cnat%2Cdis5%2Cnat4%2Ch%2Cd_h%2Ch3%26cimp%3D1%26consent%3DBOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26sl%3Doff%26excl_cat%3Dbl_chip_digital%252Cc_pan%252C%2520c_exp%252Cc_desktop%252Cc_sbb%252Cc_smc21%252Cc_si%252Cc_mgpt%252Cc_nat&eri=5&cookie=ID%3D5d1111ccd2f63f45%3AT%3D1536589718%3AS%3DALNI_MZNu77Q1nkFHrV4DsZzkj9RbYiPrw&cookie_enabled=1&bc=7&abxe=1&lmt=1536589718&dt=1536589718704&dlt=1536589717289&idt=802&frm=20&biw=1585&bih=1200&oid=3&adxs=323&adys=2047&adks=1830222912&gut=v2&ifi=7&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.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&dssz=93&icsg=11544872091663&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=620x1430&msz=468x32&ga_vid=1952892213.1536589718&ga_sid=1536589718&ga_hid=169438138&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
097041c492417db0fcdca6eb69f02c5925e29b6066acf5b8d5d460298752ee4d
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:39 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
3729
x-xss-protection
1; mode=block
google-lineitem-id
4550829480
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138243646681
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.chip.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
12 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1144401803364650&correlator=545247416422495&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fifs&adsid=NT&json_a=1&eid=22334400%2C21061459&vrg=246&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu_parts=3673%2Cchip_digital%2Cdownloads%2Cmacos%2Cartikel&enc_prev_ius=%2F0%2F1%2F2%2F3%2F4&prev_iu_szs=320x50%7C99x99%7C1x6&fluid=height&prev_scp=tfs_usr%3D1%26tile%3D6%26site%3Dchip_digital%26res%3Ddownloads%26rub%3Dmacos%26lay%3Dc1_downloads%26tgrp%3D3%26aem%3Dinf%26skv%3D1%26tfww%3D78910111213141516%26tfwiw%3D1600%26tfwih%3D1200%26kw%3Dnone%26pid%3D13725907%26uid%3DOpo9UIvNFs1XGERHQOc5BgwMAhy3rKp7%26wfxtg%3D842%2C848%2C854%2C876%2C877%2C878%2C959%2C960%26wfxtg_0%3D842%2C843%2C848%2C877%2C878%2C959%2C960%26wfxtg_1%3D842%2C843%2C844%2C846%2C848%2C878%2C959%2C960%26wfxtg_2%3D844%2C846%2C878%26emqrtt%3Dnone%26rl_seq%3D1%26sm%3Dd%2Ct6%2Cr0%2Cdis%2Cnat%2Cdis6%2Cnat5%2Cv%2Cq%2Cd_v%2Cv2%2Cq2%26cimp%3D1%26consent%3DBOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_chip_digital%252Cc_pan%252C%2520c_exp%252Cc_desktop%252Cc_sbb%252Cc_smc21%252Cc_si%252Cc_mgpt&eri=5&cookie=ID%3D5d1111ccd2f63f45%3AT%3D1536589718%3AS%3DALNI_MZNu77Q1nkFHrV4DsZzkj9RbYiPrw&cookie_enabled=1&bc=7&abxe=1&lmt=1536589718&dt=1536589718727&dlt=1536589717289&idt=802&frm=20&biw=1585&bih=1200&oid=3&adxs=963&adys=858&adks=2067316190&gut=v2&ifi=9&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.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&dssz=92&icsg=11544872091663&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=299x912&msz=299x18&ga_vid=1952892213.1536589718&ga_sid=1536589718&ga_hid=169438138&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
0e0bd05bcb5921464af7ed4a5435e077b15175967374a3a5f96aba2247d2d864
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:39 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
4847
x-xss-protection
1; mode=block
google-lineitem-id
4778176925
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138243030621
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.chip.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/
5 KB
3 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1144401803364650&correlator=545247416422495&output=json_html&callback=googletag.impl.pubads.callbackProxy6&impl=fifs&adsid=NT&json_a=1&eid=22334400%2C21061459&vrg=246&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu_parts=3673%2Cchip_digital%2Cdownloads%2Cmacos%2Cartikel&enc_prev_ius=%2F0%2F1%2F2%2F3%2F4&prev_iu_szs=88x88%7C6x1&prev_scp=tfs_usr%3D1%26tile%3D7%26site%3Dchip_digital%26res%3Ddownloads%26rub%3Dmacos%26lay%3Dc1_downloads%26tgrp%3D3%26aem%3Dinf%26skv%3D1%26tfww%3D78910111213141516%26tfwiw%3D1600%26tfwih%3D1200%26kw%3Dnone%2Ccombox%26pid%3D13725907%26uid%3DOpo9UIvNFs1XGERHQOc5BgwMAhy3rKp7%26wfxtg%3D842%2C848%2C854%2C876%2C877%2C878%2C959%2C960%26wfxtg_0%3D842%2C843%2C848%2C877%2C878%2C959%2C960%26wfxtg_1%3D842%2C843%2C844%2C846%2C848%2C878%2C959%2C960%26wfxtg_2%3D844%2C846%2C878%26emqrtt%3Dnone%26rl_seq%3D1%26sm%3Dd%2Ct7%2Cr0%2Cdis%2Cnat%2Cdis7%2Cnat6%2Ch%2Cd_h%2Ch4%26cimp%3D1%26consent%3DBOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26sl%3Doff%26excl_cat%3Dbl_chip_digital%252Cc_pan%252C%2520c_exp%252Cc_desktop%252Cc_sbb%252Cc_smc21%252Cc_si%252Cc_mgpt&eri=5&cookie=ID%3D5d1111ccd2f63f45%3AT%3D1536589718%3AS%3DALNI_MZNu77Q1nkFHrV4DsZzkj9RbYiPrw&cookie_enabled=1&bc=7&abxe=1&lmt=1536589718&dt=1536589718761&dlt=1536589717289&idt=802&frm=20&biw=1585&bih=1200&oid=3&adxs=963&adys=1316&adks=4079486826&gut=v2&ifi=11&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.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&dssz=91&icsg=11544872091663&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=299x88&msz=299x88&ga_vid=1952892213.1536589718&ga_sid=1536589718&ga_hid=169438138&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
50c0ac6ebe102fdb6da358a0f9b6fa2cb8ad829a776f8838babb8f0487419cdf
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:39 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
2549
x-xss-protection
1; mode=block
google-lineitem-id
4353545934
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138204783905
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.chip.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/
16 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1144401803364650&correlator=545247416422495&output=json_html&callback=googletag.impl.pubads.callbackProxy7&impl=fifs&adsid=NT&json_a=1&eid=22334400%2C21061459&vrg=246&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu_parts=3673%2Cchip_digital%2Cdownloads%2Cmacos%2Cartikel&enc_prev_ius=%2F0%2F1%2F2%2F3%2F4&prev_iu_szs=320x50%7C300x600%7C300x180%7C300x250%7C99x99%7C1x6&fluid=height&prev_scp=tfs_usr%3D1%26tile%3D8%26site%3Dchip_digital%26res%3Ddownloads%26rub%3Dmacos%26lay%3Dc1_downloads%26tgrp%3D3%26aem%3Dinf%26skv%3D1%26tfww%3D78910111213141516%26tfwiw%3D1600%26tfwih%3D1200%26kw%3Dnone%26pid%3D13725907%26uid%3DOpo9UIvNFs1XGERHQOc5BgwMAhy3rKp7%26wfxtg%3D842%2C848%2C854%2C876%2C877%2C878%2C959%2C960%26wfxtg_0%3D842%2C843%2C848%2C877%2C878%2C959%2C960%26wfxtg_1%3D842%2C843%2C844%2C846%2C848%2C878%2C959%2C960%26wfxtg_2%3D844%2C846%2C878%26emqrtt%3Dnone%26pos%3Ddmr2%26rl_seq%3D1%26sm%3Dd%2Ct8%2Cr0%2Cdis%2Cnat%2Cdis8%2Cnat7%2Cv%2Cq%2Cd_v%2Cv3%2Cq3%26cimp%3D1%26consent%3DBOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_chip_digital%252Cc_pan%252C%2520c_exp%252Cc_desktop%252Cc_sbb%252Cc_smc21%252Cc_si%252Cc_mgpt%252Cc_mhpa&eri=5&cookie=ID%3D5d1111ccd2f63f45%3AT%3D1536589718%3AS%3DALNI_MZNu77Q1nkFHrV4DsZzkj9RbYiPrw&cookie_enabled=1&bc=7&abxe=1&lmt=1536589718&dt=1536589718786&dlt=1536589717289&idt=802&frm=20&biw=1585&bih=1200&oid=3&adxs=963&adys=1436&adks=3307878159&gut=v2&ifi=13&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.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&dssz=90&icsg=11544872091663&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=299x1032&msz=299x32&ga_vid=1952892213.1536589718&ga_sid=1536589718&ga_hid=169438138&fws=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
cafe /
Resource Hash
4e48c5d7b5ed9a46ce4bb8ce504cd2da2f350d66c342d1e5d1a8461fbc0e07cd
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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

date
Mon, 10 Sep 2018 14:28:39 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
4512
x-xss-protection
1; mode=block
google-lineitem-id
4722717800
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138237554192
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.chip.de
access-control-expose-headers
x-google-amp-ad-validated-version
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
config.json
hgc-cf-cache-1.svonm.com/www.chip.de/
422 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.chip.de/config.json?cache=9776897088
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG5hZUdoYWlURWlrZWlzaWU9bmFlR2hhaVRFaWtlaXNpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuWGR8fCh5LlhkPTApO3kuWGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5YZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5wZyhrKSxhLk9kKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQWMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYWQoYyk7YS5adChtKTthLll0KGspO2EuSXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vaz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbN107dGhpcy5Rdj10aGlzLmFbOV07CnRoaXMuJG49dGhpcy5hWzddO3RoaXMucG49dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbMTBdfWMuV3E9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9rOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5BdDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3A6dGhpcy5QdihhKX0sUHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlF2OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy4kbjp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYT1jLldxfHxoYSxIYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9SGMubmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRmE9InNldHVwIjt0aGlzLmZjPVtdO3RoaXMuWmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy52dC5iaW5kKHRoaXMpKX1jLmZqPWI7Yi5wcm90b3R5cGU9e1plOmZ1bmN0aW9uKCl7dGhpcy5sYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGxuOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLAoiKiIpfSx6YTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sdnQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMudXQoYS5kYXRhKX0sdXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxhLmV2ZW50bGlzdGVuZXIubGVuZ3RoO2IrKylhLmV2ZW50PT10aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSx1ZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxhZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmZxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuVWYoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxmcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxqbjpmdW5jdGlvbihhLApiKXthPT1iJiYoKGI9dGhpcy5hZihhKSl8fChiPWEpKTswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGxmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIrKztyZXR1cm4gYn0sc2Y6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LEV1OmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LExmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LE1mOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAsYz0wLGg9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2Y9dS5oZWlnaHQ7MD51LnRvcCYmKGYrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJgooZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZik7aD49YiYmKGU9ITApO3JldHVybiBlfSxsYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxzZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxoPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PAoyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09ZChoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtjPWU7bj11O2w9azt3PUk7cT1tO2ZvcihmPTA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpKwpxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTYwOzc5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtlPWUrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0KKGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihmKT9lPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLApkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5vbz8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmCiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLmRmKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT17Rmg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sClBoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHdrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LG9tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxsbzpmdW5jdGlvbigpe3JldHVybiBhLkZoKCl8fGEuUGgoKXx8YS5McSgpfHxhLndrKCl8fGEub20oKX19O3JldHVybiBhLmxvKCl9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAsYz1hLmxlbmd0aDtmPGM7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0seWY6ZnVuY3Rpb24oYSl7YT10aGlzLk1hKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0samI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXA6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGYucHVzaChhW2NdKTtyZXR1cm4gZn0sQXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxwZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuR2coYikrIjoiK3RoaXMuR2coTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5GYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5GYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZixjKXt2YXIgaD1hO2QmJmImJihiPWwuSGMoYixkKSk7YiYmKGg9bC5IYyhhLGIpKTtmJiYoaD1sLkhjKGgsZikpO2MmJihoPWwuSGMoaCxjKSk7ZS5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlopd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLmdlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLkthKGYsITApO2Y9bS5LYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkdhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9CiExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFBkOmZ1bmN0aW9uKCl7bSYmbS5aP20uaXNFbmFibGVkJiZtLklvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBkKCl9LmJpbmQodGhpcyksNTAwKX0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToiIn0sTWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSx4bzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLlJjKGEpfHx0aGlzLnVyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5uZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5sZihhKSlyZXR1cm4gdGhpcy5sZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueWIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuTGEoYSxiLnZhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlBjKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLmpuKGMsYSk7cmV0dXJuIGN9LExhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlopaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLkthKGEsaCk7aD1rLkthKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09CmRbcV07cmV0dXJuIGsuR2EoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKGEsYixkLGYsYyxrLGUsdSl9LmJpbmQodGhpcyksNTAwKX0sVWY6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHU9ITA7ZSYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7Zm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LFlyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLlVmKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmZjKWZvcih2YXIgYyBpbiB0aGlzLmZjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnliKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sVmY6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07CmMuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuTGEoYSxmLnZhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ZcihmLlBjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mYz1hfSxldzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuTGEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsCmQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sbW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSwKYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxxcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5manx8UDtuZXcgUDt2YXIgZT1uZXcgUDt3aW5kb3cuRHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5laj1iO2IuSGM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLm10PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9OwpiLkJwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuJHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hbj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5WbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuWW09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuY249e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlVtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLldtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIiwKbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnl2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5DcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnY9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTm89e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Tbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IiwKbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLiRtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5abT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUGU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9lPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmRuPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5YbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IudnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLmVqfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmxsPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVsxXTt0aGlzLlRtPXRoaXMuYVs0XTt0aGlzLmxrPXRoaXMuYVs2XTt0aGlzLldsPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMuVXY9YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Jcjp0aGlzLm1pKGEpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmk6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uczp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlRtOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Vdnx8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuSHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5naj0KYjtiLnByb3RvdHlwZT17R2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxpcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHwKbmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sSWM6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkljKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSWMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxZYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkdkKHRoaXMuZmIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5JYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sbHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYigpKwoiMiJ9LEpmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuR2QodGhpcy5pcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkljKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUT1jLmdqfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnNtPXRoaXMuYVsxMF07dGhpcy5VcD10aGlzLmFbMl07dGhpcy5Ydj10aGlzLmFbMV07dGhpcy52cD10aGlzLmFbM107dGhpcy54bT10aGlzLmFbN107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5ScT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs3XX1jLnJwPWI7Yi5wcm90b3R5cGU9e3JtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlVwOnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnA6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhtOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ibzp0aGlzLlFxKGEpfSxRcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgamE9Yy5ycHx8amEsS2M9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2Mucm0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOgovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuYz9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLkJlPWJ9KShjKTt2YXIgSj1jLkJlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5paT10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLkNpPWI7Yi5wcm90b3R5cGU9e2hpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5paTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuQ2l8fGthLExjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUxjLmhpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuTGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy55YT17fTt0aGlzLkE9bnVsbDt0aGlzLmNjPTEwMDt0aGlzLm5iPTA7dGhpcy54YT0xNTA7dGhpcy5zYj0wO3RoaXMuJHQoYil9LGI6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhPyh0aGlzLm5iKyssdGhpcy5zYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmNjKSk6CjA+dGhpcy54YSYmKHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYykpfSxMdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5iPnRoaXMueGE/ITA6ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5uYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sJHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sSjpmdW5jdGlvbihiKXt0aGlzLnlhW2IuZmIoKV09YjtLJiZLLlNmJiZLLkZ1KGIpfSxMdzpmdW5jdGlvbigpe3JldHVybiBlLkVhKHRoaXMueWEpfSxIOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX0scnI6ZnVuY3Rpb24oYil7Yj1iLkRhKCk7Zm9yKHZhciBhIGluIHRoaXMueWEpaWYoYi5pZD09dGhpcy55YVthXS5EYSgpLmlkKXJldHVybiEwOwpyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Ma3x8cjsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmNjPTEwO3RoaXMubmI9MDt0aGlzLnhhPTUwO3RoaXMuSz1udWxsO3RoaXMuamE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmhiPSIiO3RoaXMuZmY9ITE7dGhpcy5OKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGc9dGhpcy5EYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9ZyliLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxOOmZ1bmN0aW9uKCl7fSxlYTpmdW5jdGlvbigpe30saXU6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LApNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuVGQ9Yn0sS3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UZH0sU2Q6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhJiYodGhpcy5uYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuY2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGtlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sJHc6ZnVuY3Rpb24oKXt9LFM6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuR3EoKXx8CnRoaXMuZm4oKTt0aGlzLmtlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sR3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFA6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGtiOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApUdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE1kOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHFnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sS3Q6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LFB3OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxWdzpmdW5jdGlvbigpe3RoaXMuZmZ8fCh0aGlzLmZmPSEwKX0sSmM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sR3c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuTmt8fHA7KGZ1bmN0aW9uKGMpe2MuVmc9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYiwKYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuS2U9IjEiO3RoaXMuTGU9IjIiO3RoaXMuSG09IjMiO3RoaXMua2M9MDt0aGlzLllmPTMwO3RoaXMudmI9W107dGhpcy5RYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlJlPXRoaXMuS2c9ITE7dGhpcy5zdGF0dXM9dGhpcy5rYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuYWQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLktnfHwodGhpcy5LZz0hMCxlLlBkKCkpfSxXZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1ImJlIuWmImJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5mdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLApnKSx0aGlzLkNnKCksdGhpcy5SZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlFhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxDZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMudmImJjA8dGhpcy52Yi5sZW5ndGgmJih0aGlzLnZiPWUudW5pcXVlKHRoaXMudmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnZiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUWEpe2Zvcih2YXIgZz0wO2c8dGhpcy5RYS5sZW5ndGg7ZysrKXRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPT10aGlzLkxiW2JdJiZhLnB1c2godGhpcy5RYVtnXS5kZXRhaWwpLHRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPHRoaXMuTGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlFhW2ddLmRldGFpbCksYj10aGlzLlFhW2ddLnJlYXNvbik7dGhpcy5MYltiXXx8KGI9InVua25vd24iLGE9W10pOwowPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxPdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkxlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LG9iOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5rY30sTWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2V9LHV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5rY30sYWQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxhdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSwKYXM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLlZnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLmZ0PXRoaXMuYVsxMF07dGhpcy5ObT10aGlzLmFbNF07dGhpcy5paz10aGlzLmFbNV07dGhpcy5RbD10aGlzLmFbNl07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy50aD10aGlzLmFbOV07dGhpcy5Ucz10aGlzLmFbNF07dGhpcy5Qbj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e2ZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nazp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5NbShhKX0sTW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5tOnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pazp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlFsOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWw6dGhpcy5zaChhKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRoOnRoaXMuU3MoYSl9LFNzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Uczp0aGlzLk9uKGEpfSxPbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWE9Yy5wb3x8bWEsTWM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuZmsoNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnJiKGIpfS5iaW5kKHRoaXMpKX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFM9Yy5kaXx8UzsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMua2Q9bnVsbDt0aGlzLkR2PTFFMzt0aGlzLmVnPW51bGw7dGhpcy5ldj0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub28pYi5vbigicGxheSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuTXAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLkNxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuQnEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkd2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5IdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFxKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5RbyhhKX0uYmluZCh0aGlzKSl9LFFvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sR3Y6ZnVuY3Rpb24oYil7dGhpcy5rZHx8KHRoaXMua2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkl2KGIpfS5iaW5kKHRoaXMpLAp0aGlzLkR2KSl9LEl2OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtkKTt0aGlzLncoKX0sSHY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2QpfSxBcTpmdW5jdGlvbihiKXt0aGlzLkJ3KGIpO3RoaXMuZWc9bmV3IERhdGU7dGhpcy5lZy10aGlzLnJ0PHRoaXMuZXY/dGhpcy53KCk6dGhpcy5tKCl9LENxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuYWQobmV3IFMoYSkpKTt0aGlzLncoKX0sTXA6ZnVuY3Rpb24oKXt9LEJxOmZ1bmN0aW9uKCl7dGhpcy5ydD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBuYT1jLmNpfHxuYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkVhKHZpZGVvanMucGxheWVycykpe3ZhciBiPQp2aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuZWl8fG9hLHBhPW5ldyBvYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Eaz10aGlzLmFbMV07dGhpcy5TbD10aGlzLmFbN107dGhpcy5LaT10aGlzLmFbM107dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVszXX1jLlFyPWI7Yi5wcm90b3R5cGU9e0NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Eazp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2w6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuSW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlFyfHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dayg0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3RoaXMua2YoKTt0aGlzLm1mKCk7dGhpcy5Sbz0hMX0sa2Y6ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy4kYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5QKGIpfSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLiRiKXt2YXIgYj10aGlzLkRhKCksCmE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuJGI9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpfSxjZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLlRkJiYoMCx0aGlzLlRkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxrYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxKYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLnNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxvYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmJiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMubWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLldkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5ZZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5vYigpLHRoaXMuZ2V0UGxheWVyKCkuUm89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmhiO2EmJihhLllkKCksYS5zYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5tYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2QoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLllmJiYhdGhpcy5oYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMub2MuaW5kZXhPZihhKSYmdGhpcy5vYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm9jLmxlbmd0aD49dGhpcy5zZCYmdGhpcy5vKCkpfSxhczpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkV1KGEudmlkZW9UYWcpP2EuJGI/dGhpcy5tKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5tY3x8dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5rZigpLGEubWYoKSl9fSl9KShjKTt2YXIgc2E9Yy5yanx8c2E7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CmUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksCmQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5ycihnKXx8KHRoaXMuSihnKSxnPW5ldyBzYShnLHRoaXMuQSksZy5OKCksZy5iKCkpfWVsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSxJdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxjcTpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUueWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMudGp8fHRhLHVhPW5ldyB0YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuY3M9dGhpcy5hWzZdO3RoaXMuQmw9dGhpcy5hWzZdO3RoaXMuSGs9dGhpcy5hWzJdO3RoaXMuWGg9dGhpcy5hWzddO3RoaXMudnE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ubT1iO2IucHJvdG90eXBlPXticzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuR2soYSl9LEdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Iazp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGg6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgdmE9Yy5ubXx8dmEsT2M9bmV3IHZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PU9jLmJzKDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUChiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5TKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7CnZhciB3YT1jLnVtfHx3YTsoZnVuY3Rpb24oYyl7Yy50bT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB4YT1jLnRtfHx4YTsoZnVuY3Rpb24oYyl7Yy52bT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmCjA8ZS5FYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgd2EoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeGEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgeWE9Yy52bXx8eWEsemE9bmV3IHlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxpPXRoaXMuYVs0XTt0aGlzLnhoPXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLmh0PXRoaXMuYVs1XTt0aGlzLmp0PXRoaXMuYVs0XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLlpnPXRoaXMuYVsyXTsKdGhpcy5IcD10aGlzLmFbMl07dGhpcy54cD10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLmNyPWI7Yi5wcm90b3R5cGU9e2tpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5saTp0aGlzLndoKGEpfSx3aDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGg6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJzOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odDp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmp0OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5ZZyhhKX0sWWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpnOnRoaXMuR3AoYSl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IcDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuZzphfX19KShjKTt2YXIgQWE9Yy5jcnx8QWEsUGM9bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMua2koNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUChhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5TKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSwKcmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGtiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEJhPWMuZ218fEJhOyhmdW5jdGlvbihjKXtjLmZtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuaWE9dGhpcy5YYj10aGlzLldhPXRoaXMuc2M9ITE7dGhpcy5qZz1lLmxiKDEwKTt0aGlzLklnPSEwO3RoaXMud2Q9dGhpcy5HZj0hMTt0aGlzLiRmKCk7dGhpcy5GbygpO3RoaXMuSGEoKX0sV3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsdHlwZW9mIGIuYmEsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuYmE/Yi5iYS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuYmE/dHlwZW9mIGIuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS50YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYudGE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEudGE/Yi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS50YT90eXBlb2YgYi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYudGE/Yi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi50YT90eXBlb2YgYi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9kOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYub2Q6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYucGQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5wZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj8KdHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYudmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5qZyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sS2M6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LHVmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5YYn0scHI6ZnVuY3Rpb24oKXtpZighdGhpcy5GZil7dmFyIGI9CnRoaXMuZ2IoKSxhPXRoaXMubnIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLkZmPSEwKX1yZXR1cm4gdGhpcy5GZn0sbnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLnNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5zYz0hMCk7cmV0dXJuIHRoaXMuc2N9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LGhlOmZ1bmN0aW9uKCl7dGhpcy53ZD0hMDt2YXIgYj10aGlzLnVmKCk7aWYoYnx8dGhpcy5oYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTmI9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5OYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlgoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxIdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuJGUmJmIuYWRzJiYodGhpcy4kZT1iLmFkcyk7cmV0dXJuIHRoaXMuJGV9LEZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLldkKCl9LmJpbmQodGhpcykpfSxjZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWYoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNmKCl9LmJpbmQodGhpcyksNTApfSwkZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5wcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLktjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLktjKCksdGhpcy53ZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndkP3RoaXMubSgpOih0aGlzLlgoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5HZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuS2MoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlgoKSk6KHRoaXMuWCghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuR2Y9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxHbzpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuUWIhPWIuYWRzLnN0YXRlJiYodGhpcy5RYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5RYil7dGhpcy5tKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlFiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwO3RoaXMubSgiZW1wdHkgdmFzdCIpfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLklnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLklnLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKTG86ZnVuY3Rpb24oKXt0aGlzLlJ3fHwoMTA8dGhpcy5Fdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5KdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5Gdil7dGhpcy5Gdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQ2E9Yy5mbXx8Q2E7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLnZnKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy52ZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSx2ZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkVhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IEJhKGJbZ10pLGEuamF8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgQ2EoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYyl9fSl9KShjKTsKdmFyIERhPWMuaG18fERhLEVhPW5ldyBEYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VbD10aGlzLmFbNV07dGhpcy5Kaj10aGlzLmFbMTBdO3RoaXMuVmg9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuV249dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVszXTt0aGlzLnhpPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzFdfWMuWXM9YjtiLnByb3RvdHlwZT17SXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkpwOnRoaXMuVGwoYSl9LFRsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbDp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSmo6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZoOnRoaXMuc3MoYSl9LHNzOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudHM6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlduOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dbzp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueGk6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmlyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Zc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuUChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5TKGEpfSxlYTpmdW5jdGlvbigpe30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMueWx8fEdhOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdjPSExO3RoaXMua2coKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZ2M9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy53YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlhlKCk6dGhpcy5tKCl9LHdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5nYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZ2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy53Yy5iaW5kKHRoaXMpLAoxMDApfX0sWGU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhlLmJpbmQodGhpcyksNTApfX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5nYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhhPWMueGx8fEhhOyhmdW5jdGlvbihjKXtjLnpsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuemx8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs1XX1jLlZvPQpiO2IucHJvdG90eXBlPXtMbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1uOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgS2E9Yy5Wb3x8S2EsUmM9bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuTG4oNCk7KGZ1bmN0aW9uKGMpe2MuSWg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5aZj1hfSxOOmZ1bmN0aW9uKCl7fSxRZDpmdW5jdGlvbihiKXt0aGlzLlpmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpmKS5wYXJlbnROb2RlO3RoaXMuUChiKTt0aGlzLlMoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTGE9Yy5JaHx8TGE7KGZ1bmN0aW9uKGMpe2MuSGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxRZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIE1hPWMuSGh8fE1hOyhmdW5jdGlvbihjKXtjLkpoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IExhKGQsYSksdGhpcy5IKGQpfHwoZC5RZChhKSx0aGlzLkooZCksCmQ9bmV3IE1hKGQsdGhpcy5BLGcpLGQuUWQoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgTmE9Yy5KaHx8TmEsT2E9bmV3IE5hKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Yaj10aGlzLmFbMTBdO3RoaXMuR249dGhpcy5hWzhdO3RoaXMuWmg9dGhpcy5hWzhdO3RoaXMuT3A9dGhpcy5hWzldO3RoaXMuZGg9dGhpcy5hWzZdO3RoaXMueXQ9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy53cz1iO2IucHJvdG90eXBlPXtXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkduOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5aaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3A6CnRoaXMuYmgoYSl9LGJoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5kaDp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLndzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Xaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5QKGIpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0KIiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBRYT1jLmJrfHxRYTsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLm5jKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLApmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSkpOnRoaXMubmMoKX0sbmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFJhPWMuYWt8fFJhOyhmdW5jdGlvbihjKXtjLmNrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fAoodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuY2t8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy54dT10aGlzLmFbMTBdO3RoaXMuamg9dGhpcy5hWzJdO3RoaXMubHc9dGhpcy5hWzldO3RoaXMuemg9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVszXTt0aGlzLkZzPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs0XTt0aGlzLmR3PXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMudW89YjtiLnByb3RvdHlwZT17RG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHU6CnRoaXMuaWgoYSl9LGloOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qaDp0aGlzLmt3KGEpfSxrdzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHc6dGhpcy55aChhKX0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpoOnRoaXMucHcoYSl9LHB3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xdzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnM6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkttOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFVhPWMudW98fFVhLFRjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLkRvKDQpOwooZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlpkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUyhiKTp0aGlzLmRhKCl9LHN0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGIsZz10aGlzLmZiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlpiJiYoMDw9Zy5pbmRleE9mKGQpfHxhLllkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwKKHRoaXMuWmQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxrYjpmdW5jdGlvbigpe3RoaXMuWmQrKztpZigxMDx0aGlzLlpkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuQWt8fFZhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5pYisrLDE1PHRoaXMuaWIpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7CmVsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCl9fSwKd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLldhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLktwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5zdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuemt8fFdhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSChhKXx8KHRoaXMuSihhKSwobmV3IFdhKGEsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBYYT1jLkJrfHxYYSxZYT0KbmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmtwPXRoaXMuYVszXTt0aGlzLmxoPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMucW49YjtiLnByb3RvdHlwZT17S3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxzOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBaYT1jLnFufHxaYSxVYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy5Lcyg0KTsoZnVuY3Rpb24oYyl7Yy5iaj0KcC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlAoYi5lbGVtZW50KTt0aGlzLlMoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxYYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgJGE9Yy5ianx8JGE7KGZ1bmN0aW9uKGMpe2MuYWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBhYj1jLmFqfHxhYjsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgJGEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGFiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYmI9Yy5janx8YmIsY2I9bmV3IGJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJpPXRoaXMuYVsxMF07dGhpcy5Ccj10aGlzLmFbOF07dGhpcy5abz10aGlzLmFbN107CnRoaXMuU3A9dGhpcy5hWzJdO3RoaXMubGo9dGhpcy5hWzFdO3RoaXMubmg9dGhpcy5hWzVdO3RoaXMuSHM9dGhpcy5hWzRdO3RoaXMuSWk9dGhpcy5hWzEwXTt0aGlzLk1yPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzldfWMuSXE9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJpOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ccjp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm86dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNwOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JaToKdGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1yOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgZGI9Yy5JcXx8ZGIsVmM9bmV3IGRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuQWkoNCk7KGZ1bmN0aW9uKGMpe2Mubmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuc2YoYiwiZWxlbWVudElEIik7dGhpcy5nZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PQpiLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5QKGcpO3RoaXMuUyhnKTt0aGlzLkZjPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5GYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRmMpfSxYYTpmdW5jdGlvbigpe3JldHVybiEwfSxLbzpmdW5jdGlvbigpe2UuTGYodGhpcy5GYyk7ZS5NZih0aGlzLkZjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sTWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgZWI9Yy5uanx8ZWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGZiPWMubWp8fGZiOyhmdW5jdGlvbihjKXtjLm9qPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLmlucmVhZCl7dmFyIGI9ay5pbnJlYWQsYT1lLnNmKGIsImVsZW1lbnRJRCIpO2UuTGYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMub2p8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuUHE9dGhpcy5hWzRdO3RoaXMuUHI9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcz1iO2IucHJvdG90eXBlPXtpbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuamw6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBxOnRoaXMuT3IoYSl9LE9yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qcjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGliPWMucHN8fGliLFdjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLmlsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sYnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxnbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuSWE9YTt0aGlzLm9mPXRoaXMuVGc9ITE7dGhpcy5hZz1kO3RoaXMud2c9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuSWE9bmV3IHooYSkpO3ZhciBlPXRoaXMuUGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTsKaWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLktkKHRoaXMuSWEudXJsKSYmbS5nZCl7dmFyIGg9bmV3IHooYS51cmwpO2guYnUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5nYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uZ2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLmlqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5vZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMud2c/dGhpcy5QYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLlBhLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVGd8fCh0aGlzLlBhLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5QYS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsmJmsudnBhaWQmJm0mJm0uUmModGhpcy5JYS51cmwpJiZ0aGlzLlBhLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuUGEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuUGEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5LZCh0aGlzLklhLnVybCk/bS5nZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLktkKHRoaXMuSWEudXJsKSx0aGlzLmFnJiZ0aGlzLmFnKCl9cmV0dXJuIHRoaXMuUGF9fX0pKGMpO3ZhciBqYj1jLmlqfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnhkPXRoaXMuZWI9bnVsbDt0aGlzLmJwPXRoaXMucGI9dGhpcy5UZj0hMTt0aGlzLnZhPSIiO3RoaXMuT2Y9ITE7dGhpcy5CYT10aGlzLk5jPSIiO3RoaXMuS2Y9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuZWU9ITE7dGhpcy5PYT1bXTt0aGlzLkNmPXRoaXMuRmI9IiI7dGhpcy5CZD0hMTt0aGlzLnJlPTA7dGhpcy5GZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkRlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuamM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucWI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMuc2U9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5IZD0hMTt0aGlzLk1vPXRoaXMuaGQ9bnVsbDt0aGlzLmxlPXRoaXMuaGM9dGhpcy5KZz10aGlzLnVlPXRoaXMuZ2Q9dGhpcy55ZD10aGlzLmxjPSExO3RoaXMuUmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuamo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5PYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdyZWdleDp0aGlzLnhkLGpzcG9wdXBzOnRoaXMuVGYsc2lkZWxvYWRzOnRoaXMucGIsZGlzYWJsZXRlc3RzOnRoaXMuYnAsaG9tYWRBbGlhczp0aGlzLnZhLAppc0luaXRpYWxpemVkOnRoaXMuT2YsZ2xvYmFsQ29uZmlnOnRoaXMuTmMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLktmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuQ2YsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5CZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5yZSxIT01BRF9WRVJJRklFRDp0aGlzLkZlLEhPTUFEX0JMT0NLRUQ6dGhpcy5EZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5qYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRWUsdGVzdEhpZGU6dGhpcy5IYix0ZXN0VGFnczp0aGlzLnFiLHRlc3RUYWdzSlM6dGhpcy5JYix0ZXN0Q29va2llOnRoaXMuR2IsdGhyb3R0bGU6dGhpcy5zZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTW8sCmFkQmxvY2tlckRldGVjdGVkOnRoaXMubGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnlkLHVzZVN0cmljdENoZWNrczp0aGlzLmdkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUmEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMub2csZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaGMsc2tpcEFsbG93ZWQ6dGhpcy5sZX19LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlJhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUmFbYl0mJjE9PXRoaXMuUmFbYl0mJihhPSEwKTtyZXR1cm4gYX0saWU6ZnVuY3Rpb24oYSl7dGhpcy5SYVthXT0hMH0sZXE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuUmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5SYVtiXSYmMT09dGhpcy5SYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxvZTpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT0KdHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5tbyhhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLlJjKGEpO2U9dGhpcy5NYShhKTtjPyh0aGlzLmFjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsaz1lLnBhdGguc3Vic3RyKDEpKTooaD0KdGhpcy5nZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmVifHx0aGlzLnhkKSYmKGs9dGhpcy5vcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sUmM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmFjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGFjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLlJjKGEpO3JldHVybiBifSxncTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudmEmJjA8dGhpcy52YS5sZW5ndGgpcmV0dXJuIHRoaXMudmE7Zm9yKGQgaW4gdGhpcy52YSlpZihiPXRoaXMudmFbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuenc7cmV0dXJuIm5vbmUifSxQYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMub2ddfSxnZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGMoKSxiPXRoaXMuc2coKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb3M6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3JldHVybiBhfSxjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5PZj0hMDt0aGlzLk5jPWE7dGhpcy5CYT1iO3RoaXMuZWU9ZDt0aGlzLmhkPWM7dGhpcy5EYz1lO3RoaXMuRWI9Cmh8fHt9O3RoaXMuWHIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5WcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWmE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFhyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk5jK3RoaXMucWMoImdsb2JhbCIpKSx0aGlzLnRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LFZyOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnFjKCJjbGllbnQiKSk7dGhpcy5HYShuZXcgeih0aGlzLkJhK3RoaXMucWMoImNsaWVudCIpKSx0aGlzLnljLmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5pZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMubGIoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnlkKXt0aGlzLnlkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9O3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlo9dGhpcy5LZj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuRGUpKTt0aGlzLnRiKCk7ZS5UYihsLm10KTsoYj1lLnlmKHRoaXMuUGMoKSkpfHwoYj1lLnlmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx0cTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQmF8fHRoaXMuRmJ8fHRoaXMudmF8fHRoaXMueWMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy52YT1hLmFsaWFzfHxudWxsO3RoaXMuQ2Y9YS5hZHBhdGh8fCIiO3RoaXMuQmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5vZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnZhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfSxUYzpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTtpZihhKXt2YXIgYj0KbmV3IHoodGhpcy5nZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucWMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLkh1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJjdXN0b21lciIpO2E/dGhpcy5mbD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLmZsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5UYyghMCl9LmJpbmQodGhpcyksITApfX0sSHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLmdkPQp0aGlzLkpiKGIuc3RyaWN0KTt0aGlzLnVlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuSmc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnFiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMueGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVGY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5wYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaGM7dGhpcy5sZT1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkdiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mCkFycmF5P3RoaXMub3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLkJkJiYodGhpcy5HYj1udWxsKTt0aGlzLnNlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuSGQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkhkPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZHYoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMucWJ8fHRoaXMuR2IpP3RoaXMuZWU/KHRoaXMub2E9dGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSksdGhpcy56ZCgpLHRoaXMudGIoKSk6dGhpcy5TdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlR1KCkpfX0sU3U6ZnVuY3Rpb24oKXt0aGlzLlJ1KCl9LFR1OmZ1bmN0aW9uKCl7dGhpcy5aPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSk7dGhpcy50YigpfSxmZDpmdW5jdGlvbihhKXt0aGlzLmxjPQohMDt0aGlzLlp8fCh0aGlzLlo9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMudGIoKSx0aGlzLnpkKCkpfSxSdTpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemcoKX1lbHNlIHRoaXMuemcoKX0seWc6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoKSk7dGhpcy5XdShmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmZkKHRoaXMuamMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnFiPW51bGwsdGhpcy5wZSgpfSxXdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5HYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmxiKCkpO3RoaXMuWHUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnlnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnlnKCl9LFh1OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0scGU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLnJlKyssdGhpcy5HYShuZXcgeih0aGlzLkdiKSx0aGlzLlF1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFlKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMueGcoKX0scWU6ZnVuY3Rpb24oYSl7dGhpcy5mZCh0aGlzLkVlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sUXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucmU/dGhpcy5wZSgpOnRoaXMucWUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy54ZygpOnRoaXMucWUoIkFBQSIpfSx4ZzpmdW5jdGlvbigpe3RoaXMuWj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy51YikpO3RoaXMudGIoKTt0aGlzLnpkKCl9LHRiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMubGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLkZlKSk7dGhpcy5oZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhkJiZ0aGlzLmhkKCl9LEpvOmZ1bmN0aW9uKCl7aWYodGhpcy51ZSYmdGhpcy5FcSgpKXt2YXIgYT10aGlzLmVxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxDZzpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT0KYS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxHYTpmdW5jdGlvbihhLGIsYyxmLGgsSWMpe2E9bmV3IGpiKGEsYixjKTtmJiYoYS5UZz0hMCk7aCYmZS5zcigpJiYoYS5vZj0hMCk7SWMmJihhLndnPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFZlOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLkxhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmdhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuYWMoKXx8KGE9dGhpcy5NYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZ2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxJbzpmdW5jdGlvbigpe3RoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuR2EoYSx0aGlzLnh2LmJpbmQodGhpcyksdGhpcy53di5iaW5kKHRoaXMpKX0seHY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5EcCgpfSx3djpmdW5jdGlvbigpe30sRHA6ZnVuY3Rpb24oKXtlLlRiKGwuQ3ApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5wYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnBiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLkxhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUTt3aW5kb3dbYy5ZYigpXT10aGlzO2UuTGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuc2V9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LHNnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGtiPWMuamp8fGtiLG09bmV3IGtiO3dpbmRvdy5Fdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml3PXRoaXMuYVs4XTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLkVoPXRoaXMuYVs0XTt0aGlzLkZrPXRoaXMuYVs5XTt0aGlzLmJ3PXRoaXMuYVs1XTt0aGlzLk9sPXRoaXMuYVs4XTt0aGlzLnVuPXRoaXMuYVs2XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuQ2w9YjtiLnByb3RvdHlwZT17aHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLml3OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllpOnRoaXMuRGgoYSl9LERoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRms6dGhpcy5hdyhhKX0sYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ3OnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5PbDp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudW46dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgbGI9Yy5DbHx8bGIsWGM9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuaHcoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiLGMpe3RoaXMuaj1hO2EudS5MP3RoaXMuTmE9YS51LkwoKTp0aGlzLk5hPSIiO3RoaXMuY29udGFpbmVyPXRoaXMuai5TYTt0aGlzLnBsYXllcj10aGlzLmoudTt0aGlzLnRjPSExO3RoaXMua289MUUzO3RoaXMuY2E9bnVsbDt0aGlzLlQ9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5lZD17fTt0aGlzLnJjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMucmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5qLnUpJiZ0aGlzLmoudS5CJiYoYT10aGlzLmoudS5CKCkpLHRoaXMucmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5kZD0hMTt0aGlzLldmPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToKMTU7dGhpcy5zPXt9O3RoaXMucGM9ITE7dGhpcy5GZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuVG89ZS5wYSgxMCk7dGhpcy5XYz1lLnBhKDEwKTt0aGlzLlVkPWUucGEoMTApO3RoaXMudGc9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUmI9dGhpcy5CYj0hMTt0aGlzLkNkPW51bGw7dGhpcy5DYz10aGlzLnVnPXRoaXMuY2c9dGhpcy5HYz10aGlzLmZ2PXRoaXMuYWI9ITF9Yy5kaj1iO2IucHJvdG90eXBlPXtwZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxEZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5GYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmxjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLAoiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQobC5abSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpfSxPZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuVC5aKXRoaXMuVC5KbygpLHRoaXMuVC5vYSYmdGhpcy5ULmlzRW5hYmxlZD8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlQuaGN9KSk6Yj8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULmhjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5zYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5PZChhLGIsYyl9LDUwKX19LCRkOmZ1bmN0aW9uKGEpe3RoaXMuR2M9ITE7dGhpcy5zPWE7dGhpcy5qdSh0aGlzLnMpO3RoaXMuemYoYSl9LAp6ZjpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5lZD10aGlzLnFxKGEpKSx0aGlzLnpmKGEucGFyZW50KSl9LHFxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5ZKXtiPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksCmUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5VYShiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuRWMmJmEuRWMuZXJyb3ImJmEuRWMuZXJyb3IuY29kZSYmKGI9YS5FYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmljLmNvZGU6Yj09Qy5tZC5jb2RlP2UuRChsLk92LHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk6KGUuUGQoKSxiPT1DLkllLmNvZGUmJmUuRChsLnlzLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpO2UuRChsLkJwLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5HZS5jb2RlOmUuRChsLnl2LAp0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguSmUuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLkQobC5Wdix0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4Lm5kLmNvZGU6ZS5EKGwuJHYsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmxkLmNvZGU6ZS5EKGwuenMsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09CmMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLnpiKGEpO3RoaXMuc2EoKX0semI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5OZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuWHc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLm1uJiZ0aGlzLnBsYXllci5KYygpJiYoYi52b2x1bWU9CnRoaXMucGxheWVyLkpjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuaG4oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkJnKGIpPyh0aGlzLmtuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5PbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuSmQoKT90aGlzLnJnKCk6dGhpcy5zLm9yaWdpbi5oZih4LmxkKX0saHU6ZnVuY3Rpb24oKXtlLlplKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkFlJiZlLmxuKHRoaXMucy5vcmlnaW4uQWUpO2UuJGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmouQzt0aGlzLmouQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5qLkMsYSk7dGhpcy5qLmRnKCk7dGhpcy5qLmVjKCk7Zm9yKGE9dGhpcy5qLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuai5lYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmouRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuc3EoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5qLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnphKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLnVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5zYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmdGhpcy5KdigpLCJBZFN0YXJ0ZWQiPT0KYS5kYXRhLm5hbWUmJnRoaXMuS3YoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk52KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk12KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx2KCkpfS5iaW5kKHRoaXMpKTtlLnVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLnNhKCl9LmJpbmQodGhpcykpO2UudWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5zYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmouZW4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKS3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sSnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS4kYSgiaW1wcmVzc2lvbiIpfSxRZzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS4kYSgic3RhcnQiKX0sUGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS4kYSgiZmlyc3RRdWFydGlsZSIpfSxOdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLiRhKCJ0aGlyZFF1YXJ0aWxlIil9LE12OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLiRhKCJjb21wbGV0ZSIpfSxMdjpmdW5jdGlvbigpe2UuJGEoImFkc3RvcHBlZCIpO3RoaXMuc2EoKX0saG46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5UO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5hYygpPyhmPWUuTWEoZiksYj1mLnByb3RvY29sKwoiOi8vIitmLmhvc3QpOmI9ZjtjLnNyYz1iLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuQXYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxCZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LGtuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLk9nLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sJGM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuT2cuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sT2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlby5jb250cm9scz0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksdGhpcy5rbyl9LHhlOmZ1bmN0aW9uKGEpe3RyeXtpZighZS5ZYSgpJiZ0aGlzLlQuSmcmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLnMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuVC5nYSgidmlkZW8tbm9vcCIpKTsKcmV0dXJufX1jYXRjaChiKXt9dGhpcy50Y3x8IXRoaXMuQmcodGhpcy52aWRlbyl8fHRoaXMuQmJ8fCh0aGlzLnRjPSEwLHRoaXMuenYoKSx0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHRoaXMuai5lYygpLHRoaXMuTGcoKSx0aGlzLk1nKCksdGhpcy5UZSgpLHRoaXMuai5kZygpLHRoaXMudmlkZW8ucGxheSYmdGhpcy5uZSgpKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy5DYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLk9jPVtdO2Zvcih2YXIgYj10aGlzLmouRyxjPTA7YzxiLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5PYy5wdXNoKGIuY2hpbGRyZW5bY10pLGIuY2hpbGRyZW5bY10uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLnJkKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5yZCgpfWVsc2UgdGhpcy5yZCgpfSxyZDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspdGhpcy5PY1thXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGE9dGhpcy52aWRlby5wbGF5KCkpJiZhWyJjYXRjaCJdKWFbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5zYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwiIiwhMCkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5lKCkpfS5iaW5kKHRoaXMpOwp0aGlzLnhmKCkucWcodGhpcyl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLkQobC5VbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMucy54Yj8odGhpcy50Yz0hMSx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZGQ9ITEsdGhpcy5qLkhnKCksdGhpcy5zLm9yaWdpbi5WZCgpKTp0aGlzLnNhKCl9LEF2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuJGModGhpcy52aWRlbyksdGhpcy5KZCgpPwp0aGlzLnJnKCk6dGhpcy5qZChhKSl9LGpkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuVmUoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZSgpKTt0aGlzLnMub3JpZ2luLmhmKHgubGQpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnYpdGhpcy5zYSgpO2Vsc2V7dGhpcy5aYj0hMDt0aGlzLmoudS5rYiYmIXRoaXMudWcmJnRoaXMuai51LmtiKCkmJmUuRChsLkFjLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLmt2KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5tZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50Zyk7YyYmKGI9dGhpcy5zLm1lLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5kZHx8KHRoaXMuZGQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGwuJG0sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTt0aGlzLnMueGI/KHRoaXMudGM9ITEsdGhpcy4kYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmRkPSExLHRoaXMuai5IZygpLHRoaXMucy5vcmlnaW4uVmQoKSk6dGhpcy5zYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5yYy5yZXBsYWNlKCJbdGltZV0iLGUucGYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMucGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHJnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5scSgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5lYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuTmcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuTGcoKTt0aGlzLk1nKCk7dGhpcy5DZD1zZXRJbnRlcnZhbCh0aGlzLkhvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sbHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZj1iPXRoaXMucy5NW2NdLGU7ZT1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLmFjKCkmJihlPWguTWEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKSG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLkNkKSx0aGlzLndlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMueWUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuQ2QpLHRoaXMuamQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmNnPSEwLHRoaXMuR2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxrdjpmdW5jdGlvbihhKXthPT10aGlzLkZnfHx0aGlzLkJifHwoMD09YSYmKHRoaXMuYWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYWIpLHRoaXMuYWI9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLkVnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5FZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5CYnx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUuRChsLldtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSksZS5EKGwuYW4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSx0aGlzLlJiJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5HYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChsLlZtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLkQobC5ZbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5EKGwuY24sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSksZS5EKGwuZG4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSwKdGhpcy5GZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5CYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnJxKHRoaXMucy5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmVkLmltcHJlc3Npb25zJiZlLnFyKGYudXJsLHRoaXMuZWQuaW1wcmVzc2lvbnMpP3RoaXMuTmQoZi51cmwsZi50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UuRChsLlhtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSx7YWRJZDp0aGlzLmVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5OZChmLnVybCxmLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy5BYT10aGlzLiRvKHRoaXMucy5BYSxhKSl9fSxOZDpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuS2EoYSksYyYmYS5nbihjKSxmfHwoZj10aGlzLmdmKSx0aGlzLlQuR2EoYSxmLHRoaXMuZ2YsITEsITApKX0scnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSwkbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx6djpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5OZy5iaW5kKHRoaXMpfSxOZzpmdW5jdGlvbigpe2UuRChsLk5vLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkdjJiZlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZS5acCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMueGN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnhjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucmMucmVwbGFjZSgiW3RpbWVdIixlLnBmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LE1nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Ubzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmJkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuV2M7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaHYuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlVkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ3YuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5WYi5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMudGc7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5tZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLmJkLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LlhhJiZ0aGlzLmoudS5YYSgpJiZ0aGlzLnVzKCk7dGhpcy5WYigpfX0sVmI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxiZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxodjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuV2MpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQobC5PZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sWWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLldjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuT2UsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5XYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sZ3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlVkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LHVzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LENiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYik7dGhpcy5DY3x8dGhpcy5wY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmUoKSl9LHNhOmZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkZhJiZ0aGlzLnBjfHwicG9zdHJvbGwiPT1lLkZhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5lYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5BZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLkFkKCl9ZWxzZSB0aGlzLkFkKCl9LEFkOmZ1bmN0aW9uKCl7dGhpcy51Zz0hMDt0aGlzLmouQmYoKTsKdGhpcy5qLk50KCk7dGhpcy5aYj0hMTtlLkQobC5Tbyx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMueGYoKS5LdCgpfSx4ZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxKZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51YSgibWluVmlzIik7YSYmKGUuTWYodGhpcy52aWRlbyxhKT90aGlzLk10KCk6dGhpcy5ZZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy54YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy54Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LGdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmRqfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs5XTt0aGlzLlN0PXRoaXMuYVsxMF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5QbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVszXX1jLlJzPWI7Yi5wcm90b3R5cGU9e1JrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tazp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlN0OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUG06dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5Sc3x8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuUmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5ZPW51bGw7dGhpcy5NYj0hMTt0aGlzLkFlPSIiO3RoaXMuemU9ITE7ZCYmZC5lbXB0eT90aGlzLiRyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmVtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ub2UodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuYWYodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5vZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5vZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KImNvbWFwcHNwb3RpbWEzdnBhaWQiKSxiLmRhdGEuaG9tYWRfY29tcGF0aWJsZV92cGFpZD0idHJ1ZSIpO20uR2EoYix0aGlzLlpyLmJpbmQodGhpcyksdGhpcy5Xci5iaW5kKHRoaXMpKX0scWY6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsKIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysKKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe31lbHNlIGMuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxacjpmdW5jdGlvbihhKXt0aGlzLkR0KGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4Lm5kKSl9dGhpcy5iYT0KdGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LCRyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkphfHwodGhpcy5KYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQ2EoeC5uZCkpfXRoaXMuYmE9dGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LFdyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguR2Use2RlcHRoOmF9KSl9LFVjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLnZyKCk/dGhpcy5ZdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFmKCksZyx7QWRTeXN0ZW06dGhpcy5YcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5mYSh0aGlzLkNhKHguSmUpKTooYT0wLHRoaXMudXYoKSYmdGhpcy4kZCh0aGlzLlVvKCkpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLk1iPyh0aGlzLk1iPTE8dGhpcy5iYS5sZW5ndGgsdGhpcy5iYS5sZW5ndGgmJnRoaXMuVWMoKSk6dGhpcy5wYXJlbnQuVmQoKX0sdXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WdSgpP3RoaXMuVXUoKT8hMDooLTEhPXRoaXMuVWIoKT90aGlzLmZhKHRoaXMuQ2EoeC5DZSkpOnRoaXMuZmEodGhpcy5DYSh4LmJpKSksITEpOih0aGlzLmZhKHRoaXMuQ2EoeC5pYyxDLkllKSksITEpfSwkZDpmdW5jdGlvbihhKXthLkFhPWEuQWEuY29uY2F0KHRoaXMuUmQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC4kZChhKX0sVW86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMudmYoKTthLnhjPXRoaXMuJHAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLldwKCk7YS5tZT10aGlzLnBxKGEuZHVyYXRpb24pOwpyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oYil7dGhpcy5ZJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguQ2UuY29kZT9iLkFhLmNvbmNhdCh0aGlzLmJxKCkpOmIuQWEuY29uY2F0KHRoaXMuanEoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuemImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC56YiYmdGhpcy5wYXJlbnQuemIoYiksYT0wLHRoaXMuVWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0saGY6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxWdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMudmYoKS5sZW5ndGh9LApVdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sRHQ6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLkFlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy56ZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2cjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQWYoKS5sZW5ndGh9LEFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FZCh0aGlzLlksIkFkU3lzdGVtIil9LFJkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxnLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuVWEoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxqcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxicTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCnZmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksdWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEN3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlVhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnVjKS1NYXRoLmFicyg3MDAtYi51Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS51YyktTWF0aC5hYnMoNzAwLWIudWMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZz1bXSxiPSExLGQ9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTWMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVWEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGV8fG0mJm0ubGUpdHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkF1KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToKIiJ9LE1jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlprPXRoaXMuYVs0XTt0aGlzLmd3PXRoaXMuYVs2XTt0aGlzLkRyPXRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbNV07dGhpcy5DdT10aGlzLmFbNl07dGhpcy5Taj10aGlzLmFbN107dGhpcy5xcD10aGlzLmFbNV07dGhpcy5Rcz10aGlzLmFbMTBdO3RoaXMuZz10aGlzLmFbMl19Yy5udj1iO2IucHJvdG90eXBlPXtZazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWms6dGhpcy5mdyhhKX0sZnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmd3OnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkRyOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NbDp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3U6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Tajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMubnZ8fHBiLFpjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLllrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMueGM9IiI7dGhpcy5PPQp0aGlzLnhiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Laz1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxzcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG5iPWMuS2t8fG5iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Wcz10aGlzLmFbOV07dGhpcy56cj10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzhdO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuams9YjtiLnByb3RvdHlwZT17aXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmp2OnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wczp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenI6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuQ20oYSl9LApDbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG06dGhpcy5JdShhKX0sSXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkp1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5qa3x8cWIsJGM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9JGMuaXYoNCk7dmFyIHg9e25kOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLGthOiJYTUxfUEFSU0VfRVJST1IifSxiaTp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsa2E6IkRVUkFUSU9OX0VSUk9SIn0saWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLAprYToiRU1QVFlfVkFTVCJ9LEplOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLGthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxHZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKa2E6IkxPQURfRVJST1IifSxsZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsa2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxydzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixrYToiTUVESUFGSUxFX0VSUk9SIn0sQ2U6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsa2E6IkRVTU1ZX0FEIn19LEM9e0hlOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsa2E6Ik5PX0FEUyJ9LEllOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixrYToiTk9fTUVESUFGSUxFUyJ9LHR3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixrYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG1kOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLGthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm51PXRoaXMuYVsxXTt0aGlzLlhzPXRoaXMuYVs0XTt0aGlzLmhsPXRoaXMuYVsxXTt0aGlzLk9qPXRoaXMuYVsxXTt0aGlzLnRvPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMuQ2g9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm51OnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaGw6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Pajp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcmI9Yy5DaHx8cmIsYWQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQubXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5FYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgb2I9Yy5MaXx8b2I7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU3I9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLkVpPQp0aGlzLmFbNF07dGhpcy5kbD10aGlzLmFbNF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5haD10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkxtPWI7Yi5wcm90b3R5cGU9e1JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNrOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5tcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWk6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbjp0aGlzLlZ0KGEpfSxWdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV3Q6dGhpcy4kZyhhKX0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTG18fHNiLGJkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuU2E9YS5yZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuVGE9e307dGhpcy5RZj0hMTt0aGlzLldiPVtdfWMuamk9YjtiLnByb3RvdHlwZT17bnE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMubnEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLm9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxHdTpmdW5jdGlvbigpe3RoaXMuUWY9ITB9LEhnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxkZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2UuRChsLkFjLHRoaXMudS5CKCkpfSxOdDpmdW5jdGlvbigpe3RoaXMuUWZ8fCh0aGlzLnUucGxheSgpLGUuRChsLkJjLHRoaXMudS5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlNhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5TYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlNhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuU2Eub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5TYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5TYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUucmYoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5EZi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sb3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGFxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sRGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hcSh0aGlzLlNhKTsKaWYoYi54IT10aGlzLlRhLnh8fGIueSE9dGhpcy5UYS55fHxiLnBvc2l0aW9uIT10aGlzLlRhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlRhLndpZHRofHxiLmhlaWdodCE9dGhpcy5UYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5UYS53aWR0aCYmMDx0aGlzLlRhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmYoKTtyZXR1cm59dGhpcy5UYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuV2IubGVuZ3RoO2ErKyl0aGlzLldiW2FdKHt3aWR0aDpiLndpZHRoLApoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLkRmLmJpbmQodGhpcyksMTApfSxlbjpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy5XYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuV2IucHVzaChhKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTj1jLmppfHxOLEI9W10sdGI9MDsxMDA+dGI7dGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRxPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVs5XTt0aGlzLnpxPXRoaXMuYVs2XTt0aGlzLkVuPXRoaXMuYVsxXTt0aGlzLlVyPXRoaXMuYVs5XTt0aGlzLnduPXRoaXMuYVsxXTt0aGlzLmJ0PXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLmlwPXRoaXMuYVs3XTt0aGlzLmdpPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuT3M9YjtiLnByb3RvdHlwZT17WnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRxOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLnlxKGEpfSx5cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenE6dGhpcy5EbihhKX0sCkRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVXI6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnduOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idDp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHY6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmlwOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5naTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMuT3N8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLlpxKDQpOyhmdW5jdGlvbihjKXtjLnVrPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMua2UoYik7dGhpcy5lZigpfSxrZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKa2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy51a3x8dmI7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7CnRoaXMud2I9dGhpcy53Ynx8ITE7dGhpcy5OZT10aGlzLlFlPXRoaXMuSGY9dGhpcy5pYT10aGlzLnRlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTHAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRlPSEwO3RoaXMuSGYmJnRoaXMuWWUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudmMoKTsKdGhpcy5IZj0hMDt0aGlzLlllKCl9LmJpbmQodGhpcykpO3RoaXMuVWUoKX0sWWU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy52YygpO2lmKCF0aGlzLnRlJiYhdGhpcy52YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudGUmJnRoaXMuTmUmJiF0aGlzLlFlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHdmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApVZTpmdW5jdGlvbigpe2lmKHRoaXMudmMoKSl7dmFyIGI9dGhpcy53ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlFlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuTmU9Yi55d310aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZSgpfS5iaW5kKHRoaXMpLDEwMCl9LEZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlN3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxrcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxMcDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpjKCl9LmJpbmQodGhpcyksMTAwKX0semM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5RYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmtxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCnRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk9rLkltLkdtP3dpbmRvdy5PTy5Pay5JbS5HbS53dyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cigpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMudmt8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQW89dGhpcy5hWzhdO3RoaXMua3I9dGhpcy5hWzhdO3RoaXMuTHU9dGhpcy5hWzNdO3RoaXMuUWs9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy52cz1iO2IucHJvdG90eXBlPXt6bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW86dGhpcy5qcihhKX0sanI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtyOnRoaXMuS3UoYSl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB6Yj1jLnZzfHx6YixkZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1kZC56byg0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMudmx8fFU7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkudGQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuSXMoYSl9LmJpbmQodGhpcykpO3kuRHEoKX0sSXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLnVsfHxWOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLlZjJiYoYj1lLmFwKGIsdGhpcy5WYykpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLAoiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGJbYV0pLGQ9bmV3IFUoaCksdGhpcy5IKGQpfHwodGhpcy5KKGQpLGY9bmV3IFYoZCx0aGlzLkEpLGYuYigpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sdGQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2JdfHwodGhpcy5hYVtiXT17fSk7dGhpcy5hYVtiXVthXXx8KHRoaXMuYWFbYl1bYV09W10pO3RoaXMuYWFbYl1bYV0ucHVzaChjKX0sWnU6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5hYXx8CnRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuYmN8fCh0aGlzLmJjPVtdKSx0aGlzLmJjLnB1c2goYiksdGhpcy5MdCgpJiYodGhpcy5sZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYwPHRoaXMuYWFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYV1bY11bZF0oYil9fSxEcTpmdW5jdGlvbigpe2lmKHRoaXMuYmMpZm9yKHZhciBiPTA7Yjx0aGlzLmJjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuYmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuYWFbY11bZF1bZl0oYSl9fSwKdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5adShiKX19KX0pKGMpO3ZhciBBYj1jLndsfHxBYix5PW5ldyBBYihxKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLmptPXRoaXMuYVsyXTt0aGlzLnFsPXRoaXMuYVs1XTt0aGlzLmxzPXRoaXMuYVszXTt0aGlzLmVvPXRoaXMuYVs0XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLktsPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJGk6CnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Rajp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFsOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sczp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW86dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51aTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLktsfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5GbCg0KTsoZnVuY3Rpb24oYyl7Yy5NaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPQohMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxrYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLk1ofHxDYjsoZnVuY3Rpb24oYyl7Yy5OaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucXR8fCh0aGlzLnF0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5OaHx8RGI7KGZ1bmN0aW9uKGMpe2MuT2g9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLAp0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy55YSlpZihhPT10aGlzLnlhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5PaHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs2XTt0aGlzLmFpPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzhdfWMubWs9YjtiLnByb3RvdHlwZT17dWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZoOnRoaXMuJGgoYSl9LCRoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5haTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdiPWMubWt8fApHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5sbT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEhiPWMubG18fEhiOyhmdW5jdGlvbihjKXtjLmttPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuU2V8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLlZwfHwodGhpcy5JZigpLAp0aGlzLlZwPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLlNlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5TZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxZcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sSWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLllwKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5pYT0hMCx0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLm8oKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZigpfS5iaW5kKHRoaXMpLDUwKX0sUXc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSGIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBJYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEpiPWMubW18fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SaD10aGlzLmFbMV07dGhpcy5ydT10aGlzLmFbNF07dGhpcy5oaD10aGlzLmFbOF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5waD10aGlzLmFbNF07dGhpcy5xaz10aGlzLmFbOV07dGhpcy56dT10aGlzLmFbOF07dGhpcy55bj10aGlzLmFbNl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5lcj10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e1FoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUmg6dGhpcy5xdShhKX0scXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ1OnRoaXMuZ2goYSl9LGdoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5oaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU246dGhpcy5vaChhKX0sCm9oOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5waDp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucWs6dGhpcy55dShhKX0seXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnp1OnRoaXMueG4oYSl9LHhuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bjp0aGlzLm53KGEpfSxudzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub3c6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgTGI9Yy5Obnx8TGIsZ2Q9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuUWgoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXIoInBsYXllclBsYXlFbmQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5bGlzdFBsYXlOZXh0IixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuRGp8fE1iOyhmdW5jdGlvbihjKXtjLkNqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IixmdW5jdGlvbigpe3RoaXMubmYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm5mKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLmJuKCl9LmJpbmQodGhpcykpLHRoaXMuU2c9ITEsdGhpcy5Sdj0xRTMsdGhpcy5mZz17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG5mOmZ1bmN0aW9uKCl7dGhpcy5mZy5kb25lfHwodGhpcy5mZy5kb25lPSEwLHRoaXMuU2c9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksdGhpcy5SdikpfSxibjpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5TZyk7dGhpcy5tKCl9LFJnOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksdGhpcy53KCkpfSx0ZjpmdW5jdGlvbihiKXt2YXIgYT1bXTtpZihiKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJmJbY11bZF0mJmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZj1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7CmEucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLnRmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMudGYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwO3JldHVybiExfX0pfSkoYyk7dmFyIE5iPWMuQ2p8fE5iOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj0KbnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjJiYoYz1uZXcgTWIoYyksdGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgTmIoYyx0aGlzLkEpKS5iKCkpKX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2I9Yy5Fanx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNzPXRoaXMuYVs1XTsKdGhpcy54aj10aGlzLmFbMl07dGhpcy5tdj10aGlzLmFbMl07dGhpcy56aj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5CaD10aGlzLmFbMV07dGhpcy5ybz10aGlzLmFbOF07dGhpcy5RaT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLlFuPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dczp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueGo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm12OnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuemo6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktuOnRoaXMuQWgoYSl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CaDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm86dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5RaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIFFiPWMuUW58fFFiLGhkPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLkJzKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgUmI9Yy5zbHx8UmI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5MZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGQoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLAoiSU1BIiksdGhpcy5vKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTApfSxMZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5ybHx8U2I7KGZ1bmN0aW9uKGMpe2MudGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgUmIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFNiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBUYj1jLnRsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzhdO3RoaXMuQm09dGhpcy5hWzddO3RoaXMucWo9dGhpcy5hWzEwXTt0aGlzLmR0PXRoaXMuYVsxXTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVs4XTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLk51PQp0aGlzLmFbMl07dGhpcy5nPXRoaXMuYVs3XX1jLkpzPWI7Yi5wcm90b3R5cGU9e0J2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLkFtKGEpfSxBbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJtOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xajp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHQ6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RcDp0aGlzLm92KGEpfSxvdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnB2OnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5GbTp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHA6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk51OnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFZiPWMuSnN8fFZiLGlkPW5ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkJ2KDQpOyhmdW5jdGlvbihjKXtjLmFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5QKGIpO3RoaXMuUyhiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmFlPSExfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy50dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpOwpiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LER1OmZ1bmN0aW9uKCl7dGhpcy5hZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFdiPWMuYWx8fFdiOyhmdW5jdGlvbihjKXtjLiRrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5LYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5qcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuS2J8fCh0aGlzLktiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLktifHx0aGlzLktiKyssdGhpcy5LYjw9dGhpcy5qcz8odGhpcy5LYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKX0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRHUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFhiPWMuJGt8fFhiOyhmdW5jdGlvbihjKXtjLmJsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBXYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBYYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFliPWMuYmx8fFliLFpiPW5ldyBZYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5waT10aGlzLmFbOV07dGhpcy5wdT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkRzPWI7Yi5wcm90b3R5cGU9e29pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5waTp0aGlzLm91KGEpfSxvdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucHU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOgphfX19KShjKTt2YXIgJGI9Yy5Ec3x8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQub2koNCk7KGZ1bmN0aW9uKGMpe2MuV2s9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy5Xa3x8YWM7KGZ1bmN0aW9uKGMpe2MuVms9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRGEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMub2IoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5QbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkxjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5OcigpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxQbzpmdW5jdGlvbigpe3RoaXMuTWUoKXx8dGhpcy5vKCEwKX0sTnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7IWIubWEmJgpiLmJhJiZiLnZ3JiZiLnh3JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmcpZm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkRhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PQphJiYodGhpcy5iZz1iW2NdKTtyZXR1cm4gdGhpcy5iZ30sTGQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuTGMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKTp0aGlzLncoKTp0aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmM9Yy5Wa3x8YmM7KGZ1bmN0aW9uKGMpe2MuWGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5wbGF5ZXJhcGkpe3ZhciBiPWsucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgYWMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBjYz1jLlhrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzJdO3RoaXMucnY9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy5vbD1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZwOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HaTp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3I6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm5sOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucnY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLm9sfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5FcCg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApwYXVzZTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJgoodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9Yy5aanx8VzsoZnVuY3Rpb24oYyl7Yy5Zaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5iZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLmJlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuYmUmJmIhPXRoaXMuYmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5VdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWD1jLllqfHxYOyhmdW5jdGlvbihjKXtjLiRqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBXKGIpLGIuamE/dGhpcy5sZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBYKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCxmYz1jLiRqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5wYi5sZW5ndGgpe3ZhciBhPW0ucGIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuVmYuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlZmKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudHY9dGhpcy5hWzJdO3RoaXMuZXM9dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzZdO3RoaXMuUHU9dGhpcy5hWzJdO3RoaXMuQXA9dGhpcy5hWzZdO3RoaXMuc2k9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbN119Yy55cD1iO2IucHJvdG90eXBlPXtzdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVzOnRoaXMuYnYoYSl9LGJ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5jdjp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlB1OnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcDp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc2k6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLnlwfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5zdig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUChhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYz8odGhpcy5TKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy54cz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sWHQ6ZnVuY3Rpb24oYil7dGhpcy5xZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54c30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLnFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5xZCYmKG5ldyBHKHRoaXMsdGhpcy5xZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLklsfHxNOyhmdW5jdGlvbihjKXtjLkhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5EZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJgp3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLmd1KCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwKMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLGEpKTpiLmwoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEc9Yy5IbHx8RzsoZnVuY3Rpb24oYyl7Yy5KbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy54YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkgoYil8fAoodGhpcy5KKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYi5YdCh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgaWM9Yy5KbHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaD10aGlzLmFbOV07dGhpcy4kbD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5ncz10aGlzLmFbMl07dGhpcy5maD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLm5vPWI7Yi5wcm90b3R5cGU9e0toOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaDp0aGlzLlpsKGEpfSxabDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56aTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdzOnRoaXMuZWgoYSl9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5maDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPQpjLm5vfHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5LaCg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5iZj0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5TKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iZn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksCjQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuYmY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3lvOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5Vanx8bGM7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWXc6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQmUobmV3IGZ1bmN0aW9uKCl7fSk7CmEuc3c9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuRnQoYSk7d2luZG93LkF3PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0fHwodGhpcy5FdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLklkfHwodGhpcy5JZD0xKTtpZigyMDx0aGlzLklkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTsKcmV0dXJufXRoaXMuSWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTsKd2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT0KdHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0saGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMuVGp8fG1jOyhmdW5jdGlvbihjKXtjLlZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgbmM9Yy5Wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5zPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzhdfWMubnQ9YjtiLnByb3RvdHlwZT17TXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5zOnRoaXMud3EoYSl9LHdxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLm50fHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Ncyg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpO2EmJnRoaXMuUChhLnBhcmVudE5vZGUpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpOwp2YXIgWT1jLkxqfHxZOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkVmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5XYT10aGlzLnNjPSExO3RoaXMuamc9ZS5sYigxMCk7dGhpcy5OZigpfSxOZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuSGEoKSwhMDt0aGlzLkVmKys7aWYoMTA8dGhpcy5FZil0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5vKCEwKToKdGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLAoyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5Lanx8WjsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYKKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5xPXRoaXMuYVsyXTt0aGlzLktxPXRoaXMuYVs0XTt0aGlzLnNuPXRoaXMuYVsxXTt0aGlzLlVrPXRoaXMuYVsxXTt0aGlzLlB0PXRoaXMuYVs4XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNF07dGhpcy5hdj10aGlzLmFbMTBdO3RoaXMuem09dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNl19Yy5Hcj1iO2IucHJvdG90eXBlPXtNcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk5xOnRoaXMuSnEoYSl9LEpxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LcTp0aGlzLnJuKGEpfSxybjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLnNuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWs6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnZvKGEpfSx2bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud286dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmF2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56bTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMuR3J8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLk1xKDQpOyhmdW5jdGlvbihjKXtjLk5pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5QKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5OaXx8dGM7KGZ1bmN0aW9uKGMpe2MuTWk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksCnRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5NaXx8dWM7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRWEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7CmVsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgdmM9Yy5PaXx8dmMsd2M9bmV3IHZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVszXTt0aGlzLkN0PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVs0XTt0aGlzLlZxPXRoaXMuYVszXTt0aGlzLlp2PXRoaXMuYVs1XTt0aGlzLmJtPXRoaXMuYVsyXTt0aGlzLlhvPXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuSGo9YjtiLnByb3RvdHlwZT17U3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DdDp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSms6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMuWXYoYSl9LApZdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWnY6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ibTp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhvOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ZcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHhjPWMuSGp8fHhjLHBkPW5ldyB4YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXBkLlNxKDQpOyhmdW5jdGlvbihjKXtjLlVpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuUChiKSx0aGlzLlMoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciB5Yz1jLlVpfHx5YzsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5XZSgpfSxXZTpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2UoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIHpjPWMuVGl8fHpjOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIuamEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5IKGIpKXt0aGlzLkooYik7KG5ldyB6YyhiLHRoaXMuQSkpLmIoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIEFjPWMuVml8fEFjLEJjPW5ldyBBYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbOV07dGhpcy5Dbj10aGlzLmFbNl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs5XX1jLkdoPWI7Yi5wcm90b3R5cGU9CntYbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW46dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlV0OnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLkJuKGEpfSxCbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ246dGhpcy5pbyhhKX0saW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5HaHx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuWG4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUGY9dGhpcy5TZj10aGlzLlJmPSExO3RoaXMuWGM9W107dGhpcy5mZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT0KdHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRhP251bGw6VGEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBZYT9udWxsOllhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLApiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgY2I/bnVsbDpjYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaGI/bnVsbDpoYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE9hP251bGw6T2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHBhP251bGw6cGF9fWMuTWs9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5tcShhKTpbXSxiO3RoaXMuU2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuUmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMubWcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmZlKXtpZih0aGlzLlBmKWJyZWFrO2I9dGhpcy5mZVtjXTt0aGlzLnZlKGIpJiYodGhpcy5YYy5wdXNoKGIpLHRoaXMubWcoYikpfX0sdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxtcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5mZVtjXSx0aGlzLnZlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEpe3RoaXMudmUoYSkmJmEuYigpfSxGdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YKcCYmIXRoaXMuUmYpZm9yKHRoaXMuUGY9ITAsYT0wO2E8dGhpcy5YYy5sZW5ndGg7YSsrKXRoaXMuWGNbYV0uc2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5YY1thXS5zYil9fX0pKGMpO3ZhciBEYz1jLk1rfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YZz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLldpPWI7Yi5wcm90b3R5cGU9e1dnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLldpfHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5XZyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuVGIobC52diksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuVGIobC5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTsKdmFyIHNkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZWE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IFEsaz0hMTtGLlliKCk7Ri5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuWWIoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkpmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5ZYigpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxGLmxyKCkse2lkOnRkfSl9LDUwMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dT10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbMTBdO3RoaXMuVW49dGhpcy5hWzVdOwp0aGlzLnlrPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzddfWMuSHE9YjtiLnByb3RvdHlwZT17c3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnR1OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TaTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQmo6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlVuOnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLkhxfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC5zdSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuaGc9dGhpcy5jb25mPXRoaXMuVmE9CnRoaXMucGxheWVyPW51bGw7dGhpcy5TYz0wO3RoaXMuTmE9IiI7dGhpcy5ZYz1bXTt0aGlzLlpjPTA7dGhpcy5pZz0hMTt0aGlzLmNlPVtdfWMuVWc9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5oZz1hfSxhZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuTmE9dGhpcy5wbGF5ZXIuTCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFp0OmZ1bmN0aW9uKGEpe3RoaXMuVmE9YX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuTGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLlZhKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMubXIoKSl0aGlzLlZhLmModGhpcy5WYS5OYyx0aGlzLlZhLkJhLHRoaXMuVmEuZWUsZnVuY3Rpb24oKXt0aGlzLmRjKGEsYil9LmJpbmQodGhpcyksdGhpcy5WYS5EYyk7ZWxzZSBpZih0aGlzLkZxKCkpdGhpcy5RdChmdW5jdGlvbigpe3RoaXMuZGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChsLkFjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkd1KCk7ay5leGl0RnVsbHNjcmVlbigpO1I9az1uZXcgTyhrLAp0aGlzLlZhLGgpO2sucGcodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX1hPXRoaXMuaHMoYSk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk1kJiYoYz10aGlzLnBsYXllci5NZCgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5PZChhLGMsZik7dGhpcy5wbGF5ZXIucWcoayl9fSxtcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlNjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuU2MuZ2V0VGltZSgpLHRoaXMuU2M9YSwzRTU8Yj8hMDohMTt0aGlzLlNjPWE7cmV0dXJuITF9LHZ1OmZ1bmN0aW9uKCl7ZS5qZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudWEoImFkVGFnIik7dGhpcy51YSgicHJlcm9sbEFkVGFnIikmJgooYT10aGlzLnVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5qZihhKSk/dGhpcy5kYyhhKTooc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX0sdXU6ZnVuY3Rpb24oYSl7ZS5qZSgicG9zdHJvbGwiKTtpZighdGhpcy5oZyl7dGhpcy5kdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZihjKSk/dGhpcy5kYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKSl9fSxqZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9CmEoYil9cmV0dXJuIGF9LEh0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaXUodGhpcy51dS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5lYSgpfSxjZDpmdW5jdGlvbihhKXtlLmplKCJtaWRyb2xsIik7aWYoIXRoaXMuWGYpe3RoaXMuWGY9ITA7dmFyIGI9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy51YSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuZGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGY9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX19LEd0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5TZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy52dSgpO3RoaXMucGxheWVyLlNkJiZ0aGlzLkd0KCk7dGhpcy5IdCgpfSxJdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5ZYy5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLlpjPXRoaXMuWWMubGVuZ3RofSxGcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5aYyYmKGE9ITApO3JldHVybiBhfSxRdDpmdW5jdGlvbihhKXt0aGlzLmlnPWE7Zm9yKGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdWyJmdW5jdGlvbiJdKHRoaXMud3QuYmluZCh0aGlzKSl9LHd0OmZ1bmN0aW9uKGEpe3RoaXMuWmMtLTthJiZ0aGlzLmNlLnB1c2goYSk7MD49dGhpcy5aYyYmdGhpcy5pZygpfSxoczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5jZS5sZW5ndGg7YysrKWI9CnRoaXMuY2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuVWd8fGdhLFI9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnI9dGhpcy5hWzEwXTt0aGlzLm9wPXRoaXMuYVszXTt0aGlzLnJoPXRoaXMuYVs2XTt0aGlzLmRtPXRoaXMuYVs2XTt0aGlzLmx1PXRoaXMuYVszXTt0aGlzLnB0PXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVsxMF07dGhpcy5obz10aGlzLmFbMTBdO3RoaXMuUm09dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzhdfWMudmk9YjtiLnByb3RvdHlwZT17YXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJyOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5xaChhKX0scWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJoOnRoaXMuY20oYSl9LApjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmRtOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sdTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHQ6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRoOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYz1jLnZpfHxHYyx2ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj12ZC5hcig0KX0pLmNhbGwobmFlR2hhaVRFaWtlaXNpZSxuYWVHaGFpVEVpa2Vpc2llKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.73 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-73.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Tue, 07 Aug 2018 07:40:57 GMT
Via
1.1 ed0c487879f809919537bf00a2f2dc8f.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
52
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
422
Last-Modified
Tue, 07 Aug 2018 07:40:10 GMT
Server
AmazonS3
ETag
"2f988edff393a29c96e2df9109950ab1"
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
CPoniVHUC5CH1umGsMnRWbKHnHnrmt08fozkIwYxRssP1CSa2s1Arg==
Expires
0
display.js
s.d.adup-tech.com/ads/ Frame 976F
4 KB
2 KB
Script
General
Full URL
https://s.d.adup-tech.com/ads/display.js?p=b0a301db334008753f83ff78ea6764f9
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27572/21691/160x600?ts=1536589718190&consent=BOT4PvXOT4PvYAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.113 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-113.fra53.r.cloudfront.net
Software
nginx /
Resource Hash
3e4882c7b6adf8be26c741c61bb4df88e4412dbc315cb734dd18cc29fc9b05c5

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 09:29:53 GMT
content-encoding
gzip
server
nginx
age
3499
etag
W/"ef005ebc7901bcc1c2f5eec3f5c8fd83"
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=3600
x-amz-cf-id
JJE0co_8M5mOeL-mn7-EvqAyCzi4ehR2OKVFU1fKgWR5zl-N1KsixA==
via
1.1 1015c68f2d8c45924ae7198c984dcdde.cloudfront.net (CloudFront)
imp
counts.yieldlab.net/ Frame 976F
0
360 B
Image
General
Full URL
https://counts.yieldlab.net/imp?s=21691&d=3855&a=27572&ts=1536589718683&tid=0f23ca83-f800-4730-b14f-3227a31f9f0e&l=0
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
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
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Sun, 09 Sep 2018 14:28:38 GMT
1
k.intellitxt.com/context/
204 B
683 B
XHR
General
Full URL
https://k.intellitxt.com/context/1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
77f4d860f1bb21b949f9f23ef951609331cfc2d20eabc9f6cee348fde9cf2da8

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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/json

Response headers

Pragma
no-cache
Date
Mon, 10 Sep 2018 14:28:38 GMT
Server
nginx
X-Powered-By
Kormorant
Vary
*
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
Content-Type
Content-Length
204
Expires
Fri, 08 Jan 2016 00:00:00 GMT
select
ad.sxp.smartclip.net/
1 KB
1 KB
XHR
General
Full URL
https://ad.sxp.smartclip.net/select?type=dyn&ple=pmp.burda.chip.intxt.de.burda~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&x=9&d1=2&d10=5&d11=0&d12=2&d2=4&d3=5&d4=0&d7=1&d8=1&d9=2&d13=4&d14=0&d15=4&d16=0&d18=0&i9=4&i13=3&i3=2&i21=4&i1=3&i14=4&i8=4&g1=0&g2=1&g3=0&g4=0&g5=1&n1=1&n2=1&n3=1&n4=0&n5=1&n6=1&n7=0&n8=1&n9=0&sinbest=5&s1=0&s2=0&survey_cap=1&frq_n=1&oneclicker=1&qualified=0&tv=2&ct_gnd=0&ct_qvc=0&d20=4&ct_agraf=0&ct_qc=0&nuggsid=474493238&ang_contxt=1&inswipe=true&cu_burda_pmp_redirect=1&optout=&consent=&rnd=38116368&ang_testid=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
176.34.121.0 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-176-34-121-0.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
6226d0f2e2f30bf71792b282b40113d65edc19466b895f33c2dc996409d17212

Request headers

X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Origin
https://www.chip.de
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
Content-Encoding
gzip
Sc-Supply-Network
10035
Vary
Accept-Encoding
P3P
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Access-Control-Allow-Origin
https://www.chip.de
Sc-Uuid
bebff81c-fee1-406f-8a90-58924ce2655b
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/xml; charset=utf-8
Sc-Device-Type
PC
Content-Length
598
uid
d.adup-tech.com/t/ Frame 740A
80 B
385 B
Script
General
Full URL
https://d.adup-tech.com/t/uid
Requested by
Host: s.d.adup-tech.com
URL: https://s.d.adup-tech.com/jsapi
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.14.76 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-14-76.eu-west-1.compute.amazonaws.com
Software
nginx /
Resource Hash
042b703a40f6f8e110aa580711d62180f50684859f59918ed69105cf36c08208

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
server
nginx
etag
W/"ssJ06O6P0-ln-WDt1W8P"
p3p
policyref="/w3c/p3p.xml", CP="OTC NOI DSP COR PSAo PSDo IVAo IVDo OTPo OUR IND"
status
200
cache-control
private, max-age=31536000
content-type
application/javascript; charset=utf-8
content-length
80
/
ssl.3.damoh.chip.de/a7bb1c5b51d8973a9e94f5713600064797109b8d/
422 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.chip.de/a7bb1c5b51d8973a9e94f5713600064797109b8d/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG5hZUdoYWlURWlrZWlzaWU9bmFlR2hhaVRFaWtlaXNpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuWGR8fCh5LlhkPTApO3kuWGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5YZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5wZyhrKSxhLk9kKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQWMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYWQoYyk7YS5adChtKTthLll0KGspO2EuSXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vaz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbN107dGhpcy5Rdj10aGlzLmFbOV07CnRoaXMuJG49dGhpcy5hWzddO3RoaXMucG49dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbMTBdfWMuV3E9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9rOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5BdDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3A6dGhpcy5QdihhKX0sUHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlF2OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy4kbjp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYT1jLldxfHxoYSxIYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9SGMubmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRmE9InNldHVwIjt0aGlzLmZjPVtdO3RoaXMuWmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy52dC5iaW5kKHRoaXMpKX1jLmZqPWI7Yi5wcm90b3R5cGU9e1plOmZ1bmN0aW9uKCl7dGhpcy5sYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGxuOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLAoiKiIpfSx6YTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sdnQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMudXQoYS5kYXRhKX0sdXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxhLmV2ZW50bGlzdGVuZXIubGVuZ3RoO2IrKylhLmV2ZW50PT10aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSx1ZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxhZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmZxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuVWYoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxmcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxqbjpmdW5jdGlvbihhLApiKXthPT1iJiYoKGI9dGhpcy5hZihhKSl8fChiPWEpKTswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGxmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIrKztyZXR1cm4gYn0sc2Y6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LEV1OmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LExmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LE1mOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAsYz0wLGg9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2Y9dS5oZWlnaHQ7MD51LnRvcCYmKGYrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJgooZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZik7aD49YiYmKGU9ITApO3JldHVybiBlfSxsYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxzZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxoPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PAoyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09ZChoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtjPWU7bj11O2w9azt3PUk7cT1tO2ZvcihmPTA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpKwpxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTYwOzc5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtlPWUrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0KKGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihmKT9lPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLApkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5vbz8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmCiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLmRmKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT17Rmg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sClBoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHdrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LG9tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxsbzpmdW5jdGlvbigpe3JldHVybiBhLkZoKCl8fGEuUGgoKXx8YS5McSgpfHxhLndrKCl8fGEub20oKX19O3JldHVybiBhLmxvKCl9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAsYz1hLmxlbmd0aDtmPGM7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0seWY6ZnVuY3Rpb24oYSl7YT10aGlzLk1hKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0samI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXA6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGYucHVzaChhW2NdKTtyZXR1cm4gZn0sQXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxwZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuR2coYikrIjoiK3RoaXMuR2coTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5GYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5GYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZixjKXt2YXIgaD1hO2QmJmImJihiPWwuSGMoYixkKSk7YiYmKGg9bC5IYyhhLGIpKTtmJiYoaD1sLkhjKGgsZikpO2MmJihoPWwuSGMoaCxjKSk7ZS5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlopd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLmdlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLkthKGYsITApO2Y9bS5LYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkdhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9CiExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFBkOmZ1bmN0aW9uKCl7bSYmbS5aP20uaXNFbmFibGVkJiZtLklvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBkKCl9LmJpbmQodGhpcyksNTAwKX0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToiIn0sTWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSx4bzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLlJjKGEpfHx0aGlzLnVyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5uZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5sZihhKSlyZXR1cm4gdGhpcy5sZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueWIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuTGEoYSxiLnZhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlBjKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLmpuKGMsYSk7cmV0dXJuIGN9LExhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlopaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLkthKGEsaCk7aD1rLkthKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09CmRbcV07cmV0dXJuIGsuR2EoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKGEsYixkLGYsYyxrLGUsdSl9LmJpbmQodGhpcyksNTAwKX0sVWY6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHU9ITA7ZSYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7Zm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LFlyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLlVmKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmZjKWZvcih2YXIgYyBpbiB0aGlzLmZjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnliKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sVmY6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07CmMuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuTGEoYSxmLnZhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ZcihmLlBjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mYz1hfSxldzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuTGEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsCmQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sbW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSwKYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxxcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5manx8UDtuZXcgUDt2YXIgZT1uZXcgUDt3aW5kb3cuRHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5laj1iO2IuSGM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLm10PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9OwpiLkJwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuJHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hbj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5WbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuWW09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuY249e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlVtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLldtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIiwKbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnl2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5DcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnY9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTm89e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Tbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IiwKbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLiRtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5abT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUGU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9lPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmRuPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5YbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IudnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLmVqfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmxsPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVsxXTt0aGlzLlRtPXRoaXMuYVs0XTt0aGlzLmxrPXRoaXMuYVs2XTt0aGlzLldsPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMuVXY9YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Jcjp0aGlzLm1pKGEpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmk6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uczp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlRtOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Vdnx8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuSHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5naj0KYjtiLnByb3RvdHlwZT17R2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxpcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHwKbmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sSWM6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkljKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSWMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxZYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkdkKHRoaXMuZmIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5JYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sbHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYigpKwoiMiJ9LEpmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuR2QodGhpcy5pcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkljKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUT1jLmdqfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnNtPXRoaXMuYVsxMF07dGhpcy5VcD10aGlzLmFbMl07dGhpcy5Ydj10aGlzLmFbMV07dGhpcy52cD10aGlzLmFbM107dGhpcy54bT10aGlzLmFbN107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5ScT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs3XX1jLnJwPWI7Yi5wcm90b3R5cGU9e3JtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlVwOnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnA6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhtOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ibzp0aGlzLlFxKGEpfSxRcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgamE9Yy5ycHx8amEsS2M9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2Mucm0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOgovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuYz9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLkJlPWJ9KShjKTt2YXIgSj1jLkJlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5paT10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLkNpPWI7Yi5wcm90b3R5cGU9e2hpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5paTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuQ2l8fGthLExjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUxjLmhpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuTGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy55YT17fTt0aGlzLkE9bnVsbDt0aGlzLmNjPTEwMDt0aGlzLm5iPTA7dGhpcy54YT0xNTA7dGhpcy5zYj0wO3RoaXMuJHQoYil9LGI6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhPyh0aGlzLm5iKyssdGhpcy5zYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmNjKSk6CjA+dGhpcy54YSYmKHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYykpfSxMdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5iPnRoaXMueGE/ITA6ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5uYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sJHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sSjpmdW5jdGlvbihiKXt0aGlzLnlhW2IuZmIoKV09YjtLJiZLLlNmJiZLLkZ1KGIpfSxMdzpmdW5jdGlvbigpe3JldHVybiBlLkVhKHRoaXMueWEpfSxIOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX0scnI6ZnVuY3Rpb24oYil7Yj1iLkRhKCk7Zm9yKHZhciBhIGluIHRoaXMueWEpaWYoYi5pZD09dGhpcy55YVthXS5EYSgpLmlkKXJldHVybiEwOwpyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Ma3x8cjsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmNjPTEwO3RoaXMubmI9MDt0aGlzLnhhPTUwO3RoaXMuSz1udWxsO3RoaXMuamE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmhiPSIiO3RoaXMuZmY9ITE7dGhpcy5OKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGc9dGhpcy5EYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9ZyliLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxOOmZ1bmN0aW9uKCl7fSxlYTpmdW5jdGlvbigpe30saXU6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LApNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuVGQ9Yn0sS3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UZH0sU2Q6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhJiYodGhpcy5uYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuY2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGtlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sJHc6ZnVuY3Rpb24oKXt9LFM6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuR3EoKXx8CnRoaXMuZm4oKTt0aGlzLmtlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sR3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFA6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGtiOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApUdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE1kOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHFnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sS3Q6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LFB3OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxWdzpmdW5jdGlvbigpe3RoaXMuZmZ8fCh0aGlzLmZmPSEwKX0sSmM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sR3c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuTmt8fHA7KGZ1bmN0aW9uKGMpe2MuVmc9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYiwKYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuS2U9IjEiO3RoaXMuTGU9IjIiO3RoaXMuSG09IjMiO3RoaXMua2M9MDt0aGlzLllmPTMwO3RoaXMudmI9W107dGhpcy5RYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlJlPXRoaXMuS2c9ITE7dGhpcy5zdGF0dXM9dGhpcy5rYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuYWQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLktnfHwodGhpcy5LZz0hMCxlLlBkKCkpfSxXZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1ImJlIuWmImJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5mdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLApnKSx0aGlzLkNnKCksdGhpcy5SZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlFhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxDZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMudmImJjA8dGhpcy52Yi5sZW5ndGgmJih0aGlzLnZiPWUudW5pcXVlKHRoaXMudmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnZiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUWEpe2Zvcih2YXIgZz0wO2c8dGhpcy5RYS5sZW5ndGg7ZysrKXRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPT10aGlzLkxiW2JdJiZhLnB1c2godGhpcy5RYVtnXS5kZXRhaWwpLHRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPHRoaXMuTGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlFhW2ddLmRldGFpbCksYj10aGlzLlFhW2ddLnJlYXNvbik7dGhpcy5MYltiXXx8KGI9InVua25vd24iLGE9W10pOwowPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxPdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkxlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LG9iOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5rY30sTWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2V9LHV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5rY30sYWQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxhdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSwKYXM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLlZnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLmZ0PXRoaXMuYVsxMF07dGhpcy5ObT10aGlzLmFbNF07dGhpcy5paz10aGlzLmFbNV07dGhpcy5RbD10aGlzLmFbNl07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy50aD10aGlzLmFbOV07dGhpcy5Ucz10aGlzLmFbNF07dGhpcy5Qbj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e2ZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nazp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5NbShhKX0sTW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5tOnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pazp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlFsOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWw6dGhpcy5zaChhKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRoOnRoaXMuU3MoYSl9LFNzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Uczp0aGlzLk9uKGEpfSxPbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWE9Yy5wb3x8bWEsTWM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuZmsoNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnJiKGIpfS5iaW5kKHRoaXMpKX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFM9Yy5kaXx8UzsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMua2Q9bnVsbDt0aGlzLkR2PTFFMzt0aGlzLmVnPW51bGw7dGhpcy5ldj0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub28pYi5vbigicGxheSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuTXAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLkNxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuQnEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkd2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5IdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFxKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5RbyhhKX0uYmluZCh0aGlzKSl9LFFvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sR3Y6ZnVuY3Rpb24oYil7dGhpcy5rZHx8KHRoaXMua2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkl2KGIpfS5iaW5kKHRoaXMpLAp0aGlzLkR2KSl9LEl2OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtkKTt0aGlzLncoKX0sSHY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2QpfSxBcTpmdW5jdGlvbihiKXt0aGlzLkJ3KGIpO3RoaXMuZWc9bmV3IERhdGU7dGhpcy5lZy10aGlzLnJ0PHRoaXMuZXY/dGhpcy53KCk6dGhpcy5tKCl9LENxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuYWQobmV3IFMoYSkpKTt0aGlzLncoKX0sTXA6ZnVuY3Rpb24oKXt9LEJxOmZ1bmN0aW9uKCl7dGhpcy5ydD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBuYT1jLmNpfHxuYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkVhKHZpZGVvanMucGxheWVycykpe3ZhciBiPQp2aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuZWl8fG9hLHBhPW5ldyBvYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Eaz10aGlzLmFbMV07dGhpcy5TbD10aGlzLmFbN107dGhpcy5LaT10aGlzLmFbM107dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVszXX1jLlFyPWI7Yi5wcm90b3R5cGU9e0NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Eazp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2w6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuSW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlFyfHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dayg0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3RoaXMua2YoKTt0aGlzLm1mKCk7dGhpcy5Sbz0hMX0sa2Y6ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy4kYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5QKGIpfSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLiRiKXt2YXIgYj10aGlzLkRhKCksCmE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuJGI9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpfSxjZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLlRkJiYoMCx0aGlzLlRkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxrYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxKYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLnNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxvYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmJiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMubWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLldkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5ZZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5vYigpLHRoaXMuZ2V0UGxheWVyKCkuUm89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmhiO2EmJihhLllkKCksYS5zYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5tYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2QoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLllmJiYhdGhpcy5oYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMub2MuaW5kZXhPZihhKSYmdGhpcy5vYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm9jLmxlbmd0aD49dGhpcy5zZCYmdGhpcy5vKCkpfSxhczpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkV1KGEudmlkZW9UYWcpP2EuJGI/dGhpcy5tKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5tY3x8dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5rZigpLGEubWYoKSl9fSl9KShjKTt2YXIgc2E9Yy5yanx8c2E7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CmUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksCmQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5ycihnKXx8KHRoaXMuSihnKSxnPW5ldyBzYShnLHRoaXMuQSksZy5OKCksZy5iKCkpfWVsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSxJdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxjcTpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUueWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMudGp8fHRhLHVhPW5ldyB0YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuY3M9dGhpcy5hWzZdO3RoaXMuQmw9dGhpcy5hWzZdO3RoaXMuSGs9dGhpcy5hWzJdO3RoaXMuWGg9dGhpcy5hWzddO3RoaXMudnE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ubT1iO2IucHJvdG90eXBlPXticzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuR2soYSl9LEdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Iazp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGg6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgdmE9Yy5ubXx8dmEsT2M9bmV3IHZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PU9jLmJzKDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUChiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5TKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7CnZhciB3YT1jLnVtfHx3YTsoZnVuY3Rpb24oYyl7Yy50bT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB4YT1jLnRtfHx4YTsoZnVuY3Rpb24oYyl7Yy52bT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmCjA8ZS5FYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgd2EoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeGEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgeWE9Yy52bXx8eWEsemE9bmV3IHlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxpPXRoaXMuYVs0XTt0aGlzLnhoPXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLmh0PXRoaXMuYVs1XTt0aGlzLmp0PXRoaXMuYVs0XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLlpnPXRoaXMuYVsyXTsKdGhpcy5IcD10aGlzLmFbMl07dGhpcy54cD10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLmNyPWI7Yi5wcm90b3R5cGU9e2tpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5saTp0aGlzLndoKGEpfSx3aDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGg6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJzOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odDp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmp0OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5ZZyhhKX0sWWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpnOnRoaXMuR3AoYSl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IcDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuZzphfX19KShjKTt2YXIgQWE9Yy5jcnx8QWEsUGM9bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMua2koNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUChhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5TKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSwKcmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGtiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEJhPWMuZ218fEJhOyhmdW5jdGlvbihjKXtjLmZtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuaWE9dGhpcy5YYj10aGlzLldhPXRoaXMuc2M9ITE7dGhpcy5qZz1lLmxiKDEwKTt0aGlzLklnPSEwO3RoaXMud2Q9dGhpcy5HZj0hMTt0aGlzLiRmKCk7dGhpcy5GbygpO3RoaXMuSGEoKX0sV3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsdHlwZW9mIGIuYmEsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuYmE/Yi5iYS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuYmE/dHlwZW9mIGIuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS50YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYudGE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEudGE/Yi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS50YT90eXBlb2YgYi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYudGE/Yi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi50YT90eXBlb2YgYi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9kOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYub2Q6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYucGQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5wZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj8KdHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYudmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5qZyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sS2M6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LHVmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5YYn0scHI6ZnVuY3Rpb24oKXtpZighdGhpcy5GZil7dmFyIGI9CnRoaXMuZ2IoKSxhPXRoaXMubnIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLkZmPSEwKX1yZXR1cm4gdGhpcy5GZn0sbnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLnNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5zYz0hMCk7cmV0dXJuIHRoaXMuc2N9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LGhlOmZ1bmN0aW9uKCl7dGhpcy53ZD0hMDt2YXIgYj10aGlzLnVmKCk7aWYoYnx8dGhpcy5oYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTmI9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5OYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlgoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxIdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuJGUmJmIuYWRzJiYodGhpcy4kZT1iLmFkcyk7cmV0dXJuIHRoaXMuJGV9LEZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLldkKCl9LmJpbmQodGhpcykpfSxjZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWYoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNmKCl9LmJpbmQodGhpcyksNTApfSwkZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5wcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLktjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLktjKCksdGhpcy53ZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndkP3RoaXMubSgpOih0aGlzLlgoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5HZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuS2MoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlgoKSk6KHRoaXMuWCghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuR2Y9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxHbzpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuUWIhPWIuYWRzLnN0YXRlJiYodGhpcy5RYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5RYil7dGhpcy5tKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlFiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwO3RoaXMubSgiZW1wdHkgdmFzdCIpfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLklnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLklnLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKTG86ZnVuY3Rpb24oKXt0aGlzLlJ3fHwoMTA8dGhpcy5Fdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5KdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5Gdil7dGhpcy5Gdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQ2E9Yy5mbXx8Q2E7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLnZnKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy52ZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSx2ZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkVhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IEJhKGJbZ10pLGEuamF8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgQ2EoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYyl9fSl9KShjKTsKdmFyIERhPWMuaG18fERhLEVhPW5ldyBEYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VbD10aGlzLmFbNV07dGhpcy5Kaj10aGlzLmFbMTBdO3RoaXMuVmg9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuV249dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVszXTt0aGlzLnhpPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzFdfWMuWXM9YjtiLnByb3RvdHlwZT17SXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkpwOnRoaXMuVGwoYSl9LFRsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbDp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSmo6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZoOnRoaXMuc3MoYSl9LHNzOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudHM6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlduOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dbzp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueGk6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmlyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Zc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuUChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5TKGEpfSxlYTpmdW5jdGlvbigpe30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMueWx8fEdhOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdjPSExO3RoaXMua2coKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZ2M9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy53YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlhlKCk6dGhpcy5tKCl9LHdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5nYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZ2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy53Yy5iaW5kKHRoaXMpLAoxMDApfX0sWGU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhlLmJpbmQodGhpcyksNTApfX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5nYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhhPWMueGx8fEhhOyhmdW5jdGlvbihjKXtjLnpsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuemx8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs1XX1jLlZvPQpiO2IucHJvdG90eXBlPXtMbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1uOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgS2E9Yy5Wb3x8S2EsUmM9bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuTG4oNCk7KGZ1bmN0aW9uKGMpe2MuSWg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5aZj1hfSxOOmZ1bmN0aW9uKCl7fSxRZDpmdW5jdGlvbihiKXt0aGlzLlpmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpmKS5wYXJlbnROb2RlO3RoaXMuUChiKTt0aGlzLlMoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTGE9Yy5JaHx8TGE7KGZ1bmN0aW9uKGMpe2MuSGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxRZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIE1hPWMuSGh8fE1hOyhmdW5jdGlvbihjKXtjLkpoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IExhKGQsYSksdGhpcy5IKGQpfHwoZC5RZChhKSx0aGlzLkooZCksCmQ9bmV3IE1hKGQsdGhpcy5BLGcpLGQuUWQoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgTmE9Yy5KaHx8TmEsT2E9bmV3IE5hKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Yaj10aGlzLmFbMTBdO3RoaXMuR249dGhpcy5hWzhdO3RoaXMuWmg9dGhpcy5hWzhdO3RoaXMuT3A9dGhpcy5hWzldO3RoaXMuZGg9dGhpcy5hWzZdO3RoaXMueXQ9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy53cz1iO2IucHJvdG90eXBlPXtXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkduOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5aaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3A6CnRoaXMuYmgoYSl9LGJoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5kaDp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLndzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Xaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5QKGIpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0KIiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBRYT1jLmJrfHxRYTsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLm5jKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLApmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSkpOnRoaXMubmMoKX0sbmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFJhPWMuYWt8fFJhOyhmdW5jdGlvbihjKXtjLmNrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fAoodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuY2t8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy54dT10aGlzLmFbMTBdO3RoaXMuamg9dGhpcy5hWzJdO3RoaXMubHc9dGhpcy5hWzldO3RoaXMuemg9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVszXTt0aGlzLkZzPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs0XTt0aGlzLmR3PXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMudW89YjtiLnByb3RvdHlwZT17RG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHU6CnRoaXMuaWgoYSl9LGloOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qaDp0aGlzLmt3KGEpfSxrdzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHc6dGhpcy55aChhKX0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpoOnRoaXMucHcoYSl9LHB3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xdzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnM6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkttOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFVhPWMudW98fFVhLFRjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLkRvKDQpOwooZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlpkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUyhiKTp0aGlzLmRhKCl9LHN0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGIsZz10aGlzLmZiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlpiJiYoMDw9Zy5pbmRleE9mKGQpfHxhLllkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwKKHRoaXMuWmQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxrYjpmdW5jdGlvbigpe3RoaXMuWmQrKztpZigxMDx0aGlzLlpkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuQWt8fFZhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5pYisrLDE1PHRoaXMuaWIpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7CmVsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCl9fSwKd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLldhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLktwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5zdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuemt8fFdhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSChhKXx8KHRoaXMuSihhKSwobmV3IFdhKGEsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBYYT1jLkJrfHxYYSxZYT0KbmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmtwPXRoaXMuYVszXTt0aGlzLmxoPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMucW49YjtiLnByb3RvdHlwZT17S3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxzOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBaYT1jLnFufHxaYSxVYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy5Lcyg0KTsoZnVuY3Rpb24oYyl7Yy5iaj0KcC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlAoYi5lbGVtZW50KTt0aGlzLlMoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxYYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgJGE9Yy5ianx8JGE7KGZ1bmN0aW9uKGMpe2MuYWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBhYj1jLmFqfHxhYjsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgJGEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGFiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYmI9Yy5janx8YmIsY2I9bmV3IGJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJpPXRoaXMuYVsxMF07dGhpcy5Ccj10aGlzLmFbOF07dGhpcy5abz10aGlzLmFbN107CnRoaXMuU3A9dGhpcy5hWzJdO3RoaXMubGo9dGhpcy5hWzFdO3RoaXMubmg9dGhpcy5hWzVdO3RoaXMuSHM9dGhpcy5hWzRdO3RoaXMuSWk9dGhpcy5hWzEwXTt0aGlzLk1yPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzldfWMuSXE9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJpOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ccjp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm86dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNwOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JaToKdGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1yOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgZGI9Yy5JcXx8ZGIsVmM9bmV3IGRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuQWkoNCk7KGZ1bmN0aW9uKGMpe2Mubmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuc2YoYiwiZWxlbWVudElEIik7dGhpcy5nZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PQpiLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5QKGcpO3RoaXMuUyhnKTt0aGlzLkZjPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5GYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRmMpfSxYYTpmdW5jdGlvbigpe3JldHVybiEwfSxLbzpmdW5jdGlvbigpe2UuTGYodGhpcy5GYyk7ZS5NZih0aGlzLkZjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sTWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgZWI9Yy5uanx8ZWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGZiPWMubWp8fGZiOyhmdW5jdGlvbihjKXtjLm9qPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLmlucmVhZCl7dmFyIGI9ay5pbnJlYWQsYT1lLnNmKGIsImVsZW1lbnRJRCIpO2UuTGYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMub2p8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuUHE9dGhpcy5hWzRdO3RoaXMuUHI9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcz1iO2IucHJvdG90eXBlPXtpbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuamw6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBxOnRoaXMuT3IoYSl9LE9yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qcjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGliPWMucHN8fGliLFdjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLmlsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sYnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxnbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuSWE9YTt0aGlzLm9mPXRoaXMuVGc9ITE7dGhpcy5hZz1kO3RoaXMud2c9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuSWE9bmV3IHooYSkpO3ZhciBlPXRoaXMuUGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTsKaWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLktkKHRoaXMuSWEudXJsKSYmbS5nZCl7dmFyIGg9bmV3IHooYS51cmwpO2guYnUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5nYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uZ2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLmlqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5vZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMud2c/dGhpcy5QYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLlBhLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVGd8fCh0aGlzLlBhLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5QYS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsmJmsudnBhaWQmJm0mJm0uUmModGhpcy5JYS51cmwpJiZ0aGlzLlBhLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuUGEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuUGEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5LZCh0aGlzLklhLnVybCk/bS5nZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLktkKHRoaXMuSWEudXJsKSx0aGlzLmFnJiZ0aGlzLmFnKCl9cmV0dXJuIHRoaXMuUGF9fX0pKGMpO3ZhciBqYj1jLmlqfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnhkPXRoaXMuZWI9bnVsbDt0aGlzLmJwPXRoaXMucGI9dGhpcy5UZj0hMTt0aGlzLnZhPSIiO3RoaXMuT2Y9ITE7dGhpcy5CYT10aGlzLk5jPSIiO3RoaXMuS2Y9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuZWU9ITE7dGhpcy5PYT1bXTt0aGlzLkNmPXRoaXMuRmI9IiI7dGhpcy5CZD0hMTt0aGlzLnJlPTA7dGhpcy5GZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkRlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuamM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucWI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMuc2U9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5IZD0hMTt0aGlzLk1vPXRoaXMuaGQ9bnVsbDt0aGlzLmxlPXRoaXMuaGM9dGhpcy5KZz10aGlzLnVlPXRoaXMuZ2Q9dGhpcy55ZD10aGlzLmxjPSExO3RoaXMuUmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuamo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5PYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdyZWdleDp0aGlzLnhkLGpzcG9wdXBzOnRoaXMuVGYsc2lkZWxvYWRzOnRoaXMucGIsZGlzYWJsZXRlc3RzOnRoaXMuYnAsaG9tYWRBbGlhczp0aGlzLnZhLAppc0luaXRpYWxpemVkOnRoaXMuT2YsZ2xvYmFsQ29uZmlnOnRoaXMuTmMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLktmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuQ2YsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5CZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5yZSxIT01BRF9WRVJJRklFRDp0aGlzLkZlLEhPTUFEX0JMT0NLRUQ6dGhpcy5EZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5qYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRWUsdGVzdEhpZGU6dGhpcy5IYix0ZXN0VGFnczp0aGlzLnFiLHRlc3RUYWdzSlM6dGhpcy5JYix0ZXN0Q29va2llOnRoaXMuR2IsdGhyb3R0bGU6dGhpcy5zZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTW8sCmFkQmxvY2tlckRldGVjdGVkOnRoaXMubGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnlkLHVzZVN0cmljdENoZWNrczp0aGlzLmdkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUmEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMub2csZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaGMsc2tpcEFsbG93ZWQ6dGhpcy5sZX19LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlJhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUmFbYl0mJjE9PXRoaXMuUmFbYl0mJihhPSEwKTtyZXR1cm4gYX0saWU6ZnVuY3Rpb24oYSl7dGhpcy5SYVthXT0hMH0sZXE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuUmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5SYVtiXSYmMT09dGhpcy5SYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxvZTpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT0KdHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5tbyhhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLlJjKGEpO2U9dGhpcy5NYShhKTtjPyh0aGlzLmFjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsaz1lLnBhdGguc3Vic3RyKDEpKTooaD0KdGhpcy5nZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmVifHx0aGlzLnhkKSYmKGs9dGhpcy5vcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sUmM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmFjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGFjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLlJjKGEpO3JldHVybiBifSxncTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudmEmJjA8dGhpcy52YS5sZW5ndGgpcmV0dXJuIHRoaXMudmE7Zm9yKGQgaW4gdGhpcy52YSlpZihiPXRoaXMudmFbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuenc7cmV0dXJuIm5vbmUifSxQYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMub2ddfSxnZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGMoKSxiPXRoaXMuc2coKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb3M6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3JldHVybiBhfSxjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5PZj0hMDt0aGlzLk5jPWE7dGhpcy5CYT1iO3RoaXMuZWU9ZDt0aGlzLmhkPWM7dGhpcy5EYz1lO3RoaXMuRWI9Cmh8fHt9O3RoaXMuWHIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5WcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWmE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFhyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk5jK3RoaXMucWMoImdsb2JhbCIpKSx0aGlzLnRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LFZyOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnFjKCJjbGllbnQiKSk7dGhpcy5HYShuZXcgeih0aGlzLkJhK3RoaXMucWMoImNsaWVudCIpKSx0aGlzLnljLmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5pZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMubGIoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnlkKXt0aGlzLnlkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9O3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlo9dGhpcy5LZj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuRGUpKTt0aGlzLnRiKCk7ZS5UYihsLm10KTsoYj1lLnlmKHRoaXMuUGMoKSkpfHwoYj1lLnlmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx0cTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQmF8fHRoaXMuRmJ8fHRoaXMudmF8fHRoaXMueWMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy52YT1hLmFsaWFzfHxudWxsO3RoaXMuQ2Y9YS5hZHBhdGh8fCIiO3RoaXMuQmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5vZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnZhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfSxUYzpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTtpZihhKXt2YXIgYj0KbmV3IHoodGhpcy5nZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucWMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLkh1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJjdXN0b21lciIpO2E/dGhpcy5mbD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLmZsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5UYyghMCl9LmJpbmQodGhpcyksITApfX0sSHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLmdkPQp0aGlzLkpiKGIuc3RyaWN0KTt0aGlzLnVlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuSmc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnFiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMueGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVGY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5wYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaGM7dGhpcy5sZT1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkdiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mCkFycmF5P3RoaXMub3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLkJkJiYodGhpcy5HYj1udWxsKTt0aGlzLnNlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuSGQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkhkPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZHYoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMucWJ8fHRoaXMuR2IpP3RoaXMuZWU/KHRoaXMub2E9dGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSksdGhpcy56ZCgpLHRoaXMudGIoKSk6dGhpcy5TdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlR1KCkpfX0sU3U6ZnVuY3Rpb24oKXt0aGlzLlJ1KCl9LFR1OmZ1bmN0aW9uKCl7dGhpcy5aPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSk7dGhpcy50YigpfSxmZDpmdW5jdGlvbihhKXt0aGlzLmxjPQohMDt0aGlzLlp8fCh0aGlzLlo9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMudGIoKSx0aGlzLnpkKCkpfSxSdTpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemcoKX1lbHNlIHRoaXMuemcoKX0seWc6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoKSk7dGhpcy5XdShmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmZkKHRoaXMuamMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnFiPW51bGwsdGhpcy5wZSgpfSxXdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5HYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmxiKCkpO3RoaXMuWHUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnlnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnlnKCl9LFh1OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0scGU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLnJlKyssdGhpcy5HYShuZXcgeih0aGlzLkdiKSx0aGlzLlF1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFlKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMueGcoKX0scWU6ZnVuY3Rpb24oYSl7dGhpcy5mZCh0aGlzLkVlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sUXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucmU/dGhpcy5wZSgpOnRoaXMucWUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy54ZygpOnRoaXMucWUoIkFBQSIpfSx4ZzpmdW5jdGlvbigpe3RoaXMuWj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy51YikpO3RoaXMudGIoKTt0aGlzLnpkKCl9LHRiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMubGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLkZlKSk7dGhpcy5oZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhkJiZ0aGlzLmhkKCl9LEpvOmZ1bmN0aW9uKCl7aWYodGhpcy51ZSYmdGhpcy5FcSgpKXt2YXIgYT10aGlzLmVxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxDZzpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT0KYS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxHYTpmdW5jdGlvbihhLGIsYyxmLGgsSWMpe2E9bmV3IGpiKGEsYixjKTtmJiYoYS5UZz0hMCk7aCYmZS5zcigpJiYoYS5vZj0hMCk7SWMmJihhLndnPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFZlOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLkxhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmdhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuYWMoKXx8KGE9dGhpcy5NYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZ2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxJbzpmdW5jdGlvbigpe3RoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuR2EoYSx0aGlzLnh2LmJpbmQodGhpcyksdGhpcy53di5iaW5kKHRoaXMpKX0seHY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5EcCgpfSx3djpmdW5jdGlvbigpe30sRHA6ZnVuY3Rpb24oKXtlLlRiKGwuQ3ApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5wYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnBiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLkxhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUTt3aW5kb3dbYy5ZYigpXT10aGlzO2UuTGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuc2V9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LHNnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGtiPWMuamp8fGtiLG09bmV3IGtiO3dpbmRvdy5Fdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml3PXRoaXMuYVs4XTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLkVoPXRoaXMuYVs0XTt0aGlzLkZrPXRoaXMuYVs5XTt0aGlzLmJ3PXRoaXMuYVs1XTt0aGlzLk9sPXRoaXMuYVs4XTt0aGlzLnVuPXRoaXMuYVs2XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuQ2w9YjtiLnByb3RvdHlwZT17aHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLml3OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllpOnRoaXMuRGgoYSl9LERoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRms6dGhpcy5hdyhhKX0sYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ3OnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5PbDp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudW46dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgbGI9Yy5DbHx8bGIsWGM9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuaHcoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiLGMpe3RoaXMuaj1hO2EudS5MP3RoaXMuTmE9YS51LkwoKTp0aGlzLk5hPSIiO3RoaXMuY29udGFpbmVyPXRoaXMuai5TYTt0aGlzLnBsYXllcj10aGlzLmoudTt0aGlzLnRjPSExO3RoaXMua289MUUzO3RoaXMuY2E9bnVsbDt0aGlzLlQ9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5lZD17fTt0aGlzLnJjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMucmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5qLnUpJiZ0aGlzLmoudS5CJiYoYT10aGlzLmoudS5CKCkpLHRoaXMucmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5kZD0hMTt0aGlzLldmPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToKMTU7dGhpcy5zPXt9O3RoaXMucGM9ITE7dGhpcy5GZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuVG89ZS5wYSgxMCk7dGhpcy5XYz1lLnBhKDEwKTt0aGlzLlVkPWUucGEoMTApO3RoaXMudGc9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUmI9dGhpcy5CYj0hMTt0aGlzLkNkPW51bGw7dGhpcy5DYz10aGlzLnVnPXRoaXMuY2c9dGhpcy5HYz10aGlzLmZ2PXRoaXMuYWI9ITF9Yy5kaj1iO2IucHJvdG90eXBlPXtwZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxEZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5GYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmxjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLAoiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQobC5abSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpfSxPZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuVC5aKXRoaXMuVC5KbygpLHRoaXMuVC5vYSYmdGhpcy5ULmlzRW5hYmxlZD8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlQuaGN9KSk6Yj8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULmhjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5zYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5PZChhLGIsYyl9LDUwKX19LCRkOmZ1bmN0aW9uKGEpe3RoaXMuR2M9ITE7dGhpcy5zPWE7dGhpcy5qdSh0aGlzLnMpO3RoaXMuemYoYSl9LAp6ZjpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5lZD10aGlzLnFxKGEpKSx0aGlzLnpmKGEucGFyZW50KSl9LHFxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5ZKXtiPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksCmUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5VYShiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuRWMmJmEuRWMuZXJyb3ImJmEuRWMuZXJyb3IuY29kZSYmKGI9YS5FYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmljLmNvZGU6Yj09Qy5tZC5jb2RlP2UuRChsLk92LHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk6KGUuUGQoKSxiPT1DLkllLmNvZGUmJmUuRChsLnlzLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpO2UuRChsLkJwLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5HZS5jb2RlOmUuRChsLnl2LAp0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguSmUuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLkQobC5Wdix0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4Lm5kLmNvZGU6ZS5EKGwuJHYsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmxkLmNvZGU6ZS5EKGwuenMsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09CmMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLnpiKGEpO3RoaXMuc2EoKX0semI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5OZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuWHc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLm1uJiZ0aGlzLnBsYXllci5KYygpJiYoYi52b2x1bWU9CnRoaXMucGxheWVyLkpjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuaG4oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkJnKGIpPyh0aGlzLmtuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5PbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuSmQoKT90aGlzLnJnKCk6dGhpcy5zLm9yaWdpbi5oZih4LmxkKX0saHU6ZnVuY3Rpb24oKXtlLlplKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkFlJiZlLmxuKHRoaXMucy5vcmlnaW4uQWUpO2UuJGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmouQzt0aGlzLmouQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5qLkMsYSk7dGhpcy5qLmRnKCk7dGhpcy5qLmVjKCk7Zm9yKGE9dGhpcy5qLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuai5lYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmouRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuc3EoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5qLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnphKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLnVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5zYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmdGhpcy5KdigpLCJBZFN0YXJ0ZWQiPT0KYS5kYXRhLm5hbWUmJnRoaXMuS3YoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk52KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk12KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx2KCkpfS5iaW5kKHRoaXMpKTtlLnVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLnNhKCl9LmJpbmQodGhpcykpO2UudWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5zYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmouZW4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKS3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sSnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS4kYSgiaW1wcmVzc2lvbiIpfSxRZzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS4kYSgic3RhcnQiKX0sUGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS4kYSgiZmlyc3RRdWFydGlsZSIpfSxOdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLiRhKCJ0aGlyZFF1YXJ0aWxlIil9LE12OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLiRhKCJjb21wbGV0ZSIpfSxMdjpmdW5jdGlvbigpe2UuJGEoImFkc3RvcHBlZCIpO3RoaXMuc2EoKX0saG46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5UO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5hYygpPyhmPWUuTWEoZiksYj1mLnByb3RvY29sKwoiOi8vIitmLmhvc3QpOmI9ZjtjLnNyYz1iLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuQXYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxCZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LGtuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLk9nLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sJGM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuT2cuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sT2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlby5jb250cm9scz0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksdGhpcy5rbyl9LHhlOmZ1bmN0aW9uKGEpe3RyeXtpZighZS5ZYSgpJiZ0aGlzLlQuSmcmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLnMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuVC5nYSgidmlkZW8tbm9vcCIpKTsKcmV0dXJufX1jYXRjaChiKXt9dGhpcy50Y3x8IXRoaXMuQmcodGhpcy52aWRlbyl8fHRoaXMuQmJ8fCh0aGlzLnRjPSEwLHRoaXMuenYoKSx0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHRoaXMuai5lYygpLHRoaXMuTGcoKSx0aGlzLk1nKCksdGhpcy5UZSgpLHRoaXMuai5kZygpLHRoaXMudmlkZW8ucGxheSYmdGhpcy5uZSgpKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy5DYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLk9jPVtdO2Zvcih2YXIgYj10aGlzLmouRyxjPTA7YzxiLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5PYy5wdXNoKGIuY2hpbGRyZW5bY10pLGIuY2hpbGRyZW5bY10uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLnJkKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5yZCgpfWVsc2UgdGhpcy5yZCgpfSxyZDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspdGhpcy5PY1thXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGE9dGhpcy52aWRlby5wbGF5KCkpJiZhWyJjYXRjaCJdKWFbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5zYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwiIiwhMCkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5lKCkpfS5iaW5kKHRoaXMpOwp0aGlzLnhmKCkucWcodGhpcyl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLkQobC5VbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMucy54Yj8odGhpcy50Yz0hMSx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZGQ9ITEsdGhpcy5qLkhnKCksdGhpcy5zLm9yaWdpbi5WZCgpKTp0aGlzLnNhKCl9LEF2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuJGModGhpcy52aWRlbyksdGhpcy5KZCgpPwp0aGlzLnJnKCk6dGhpcy5qZChhKSl9LGpkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuVmUoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZSgpKTt0aGlzLnMub3JpZ2luLmhmKHgubGQpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnYpdGhpcy5zYSgpO2Vsc2V7dGhpcy5aYj0hMDt0aGlzLmoudS5rYiYmIXRoaXMudWcmJnRoaXMuai51LmtiKCkmJmUuRChsLkFjLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLmt2KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5tZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50Zyk7YyYmKGI9dGhpcy5zLm1lLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5kZHx8KHRoaXMuZGQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGwuJG0sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTt0aGlzLnMueGI/KHRoaXMudGM9ITEsdGhpcy4kYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmRkPSExLHRoaXMuai5IZygpLHRoaXMucy5vcmlnaW4uVmQoKSk6dGhpcy5zYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5yYy5yZXBsYWNlKCJbdGltZV0iLGUucGYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMucGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHJnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5scSgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5lYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuTmcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuTGcoKTt0aGlzLk1nKCk7dGhpcy5DZD1zZXRJbnRlcnZhbCh0aGlzLkhvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sbHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZj1iPXRoaXMucy5NW2NdLGU7ZT1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLmFjKCkmJihlPWguTWEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKSG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLkNkKSx0aGlzLndlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMueWUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuQ2QpLHRoaXMuamQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmNnPSEwLHRoaXMuR2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxrdjpmdW5jdGlvbihhKXthPT10aGlzLkZnfHx0aGlzLkJifHwoMD09YSYmKHRoaXMuYWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYWIpLHRoaXMuYWI9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLkVnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5FZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5CYnx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUuRChsLldtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSksZS5EKGwuYW4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSx0aGlzLlJiJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5HYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChsLlZtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLkQobC5ZbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5EKGwuY24sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSksZS5EKGwuZG4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSwKdGhpcy5GZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5CYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnJxKHRoaXMucy5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmVkLmltcHJlc3Npb25zJiZlLnFyKGYudXJsLHRoaXMuZWQuaW1wcmVzc2lvbnMpP3RoaXMuTmQoZi51cmwsZi50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UuRChsLlhtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSx7YWRJZDp0aGlzLmVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5OZChmLnVybCxmLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy5BYT10aGlzLiRvKHRoaXMucy5BYSxhKSl9fSxOZDpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuS2EoYSksYyYmYS5nbihjKSxmfHwoZj10aGlzLmdmKSx0aGlzLlQuR2EoYSxmLHRoaXMuZ2YsITEsITApKX0scnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSwkbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx6djpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5OZy5iaW5kKHRoaXMpfSxOZzpmdW5jdGlvbigpe2UuRChsLk5vLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkdjJiZlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZS5acCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMueGN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnhjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucmMucmVwbGFjZSgiW3RpbWVdIixlLnBmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LE1nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Ubzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmJkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuV2M7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaHYuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlVkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ3YuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5WYi5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMudGc7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5tZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLmJkLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LlhhJiZ0aGlzLmoudS5YYSgpJiZ0aGlzLnVzKCk7dGhpcy5WYigpfX0sVmI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxiZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxodjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuV2MpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQobC5PZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sWWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLldjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuT2UsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5XYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sZ3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlVkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LHVzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LENiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYik7dGhpcy5DY3x8dGhpcy5wY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmUoKSl9LHNhOmZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkZhJiZ0aGlzLnBjfHwicG9zdHJvbGwiPT1lLkZhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5lYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5BZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLkFkKCl9ZWxzZSB0aGlzLkFkKCl9LEFkOmZ1bmN0aW9uKCl7dGhpcy51Zz0hMDt0aGlzLmouQmYoKTsKdGhpcy5qLk50KCk7dGhpcy5aYj0hMTtlLkQobC5Tbyx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMueGYoKS5LdCgpfSx4ZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxKZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51YSgibWluVmlzIik7YSYmKGUuTWYodGhpcy52aWRlbyxhKT90aGlzLk10KCk6dGhpcy5ZZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy54YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy54Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LGdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmRqfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs5XTt0aGlzLlN0PXRoaXMuYVsxMF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5QbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVszXX1jLlJzPWI7Yi5wcm90b3R5cGU9e1JrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tazp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlN0OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUG06dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5Sc3x8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuUmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5ZPW51bGw7dGhpcy5NYj0hMTt0aGlzLkFlPSIiO3RoaXMuemU9ITE7ZCYmZC5lbXB0eT90aGlzLiRyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmVtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ub2UodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuYWYodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5vZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5vZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KImNvbWFwcHNwb3RpbWEzdnBhaWQiKSxiLmRhdGEuaG9tYWRfY29tcGF0aWJsZV92cGFpZD0idHJ1ZSIpO20uR2EoYix0aGlzLlpyLmJpbmQodGhpcyksdGhpcy5Xci5iaW5kKHRoaXMpKX0scWY6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsKIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysKKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe31lbHNlIGMuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxacjpmdW5jdGlvbihhKXt0aGlzLkR0KGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4Lm5kKSl9dGhpcy5iYT0KdGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LCRyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkphfHwodGhpcy5KYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQ2EoeC5uZCkpfXRoaXMuYmE9dGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LFdyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguR2Use2RlcHRoOmF9KSl9LFVjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLnZyKCk/dGhpcy5ZdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFmKCksZyx7QWRTeXN0ZW06dGhpcy5YcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5mYSh0aGlzLkNhKHguSmUpKTooYT0wLHRoaXMudXYoKSYmdGhpcy4kZCh0aGlzLlVvKCkpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLk1iPyh0aGlzLk1iPTE8dGhpcy5iYS5sZW5ndGgsdGhpcy5iYS5sZW5ndGgmJnRoaXMuVWMoKSk6dGhpcy5wYXJlbnQuVmQoKX0sdXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WdSgpP3RoaXMuVXUoKT8hMDooLTEhPXRoaXMuVWIoKT90aGlzLmZhKHRoaXMuQ2EoeC5DZSkpOnRoaXMuZmEodGhpcy5DYSh4LmJpKSksITEpOih0aGlzLmZhKHRoaXMuQ2EoeC5pYyxDLkllKSksITEpfSwkZDpmdW5jdGlvbihhKXthLkFhPWEuQWEuY29uY2F0KHRoaXMuUmQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC4kZChhKX0sVW86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMudmYoKTthLnhjPXRoaXMuJHAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLldwKCk7YS5tZT10aGlzLnBxKGEuZHVyYXRpb24pOwpyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oYil7dGhpcy5ZJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguQ2UuY29kZT9iLkFhLmNvbmNhdCh0aGlzLmJxKCkpOmIuQWEuY29uY2F0KHRoaXMuanEoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuemImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC56YiYmdGhpcy5wYXJlbnQuemIoYiksYT0wLHRoaXMuVWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0saGY6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxWdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMudmYoKS5sZW5ndGh9LApVdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sRHQ6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLkFlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy56ZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2cjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQWYoKS5sZW5ndGh9LEFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FZCh0aGlzLlksIkFkU3lzdGVtIil9LFJkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxnLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuVWEoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxqcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxicTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCnZmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksdWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEN3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlVhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnVjKS1NYXRoLmFicyg3MDAtYi51Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS51YyktTWF0aC5hYnMoNzAwLWIudWMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZz1bXSxiPSExLGQ9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTWMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVWEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGV8fG0mJm0ubGUpdHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkF1KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToKIiJ9LE1jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlprPXRoaXMuYVs0XTt0aGlzLmd3PXRoaXMuYVs2XTt0aGlzLkRyPXRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbNV07dGhpcy5DdT10aGlzLmFbNl07dGhpcy5Taj10aGlzLmFbN107dGhpcy5xcD10aGlzLmFbNV07dGhpcy5Rcz10aGlzLmFbMTBdO3RoaXMuZz10aGlzLmFbMl19Yy5udj1iO2IucHJvdG90eXBlPXtZazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWms6dGhpcy5mdyhhKX0sZnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmd3OnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkRyOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NbDp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3U6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Tajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMubnZ8fHBiLFpjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLllrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMueGM9IiI7dGhpcy5PPQp0aGlzLnhiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Laz1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxzcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG5iPWMuS2t8fG5iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Wcz10aGlzLmFbOV07dGhpcy56cj10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzhdO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuams9YjtiLnByb3RvdHlwZT17aXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmp2OnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wczp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenI6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuQ20oYSl9LApDbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG06dGhpcy5JdShhKX0sSXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkp1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5qa3x8cWIsJGM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9JGMuaXYoNCk7dmFyIHg9e25kOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLGthOiJYTUxfUEFSU0VfRVJST1IifSxiaTp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsa2E6IkRVUkFUSU9OX0VSUk9SIn0saWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLAprYToiRU1QVFlfVkFTVCJ9LEplOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLGthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxHZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKa2E6IkxPQURfRVJST1IifSxsZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsa2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxydzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixrYToiTUVESUFGSUxFX0VSUk9SIn0sQ2U6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsa2E6IkRVTU1ZX0FEIn19LEM9e0hlOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsa2E6Ik5PX0FEUyJ9LEllOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixrYToiTk9fTUVESUFGSUxFUyJ9LHR3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixrYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG1kOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLGthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm51PXRoaXMuYVsxXTt0aGlzLlhzPXRoaXMuYVs0XTt0aGlzLmhsPXRoaXMuYVsxXTt0aGlzLk9qPXRoaXMuYVsxXTt0aGlzLnRvPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMuQ2g9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm51OnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaGw6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Pajp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcmI9Yy5DaHx8cmIsYWQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQubXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5FYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgb2I9Yy5MaXx8b2I7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU3I9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLkVpPQp0aGlzLmFbNF07dGhpcy5kbD10aGlzLmFbNF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5haD10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkxtPWI7Yi5wcm90b3R5cGU9e1JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNrOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5tcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWk6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbjp0aGlzLlZ0KGEpfSxWdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV3Q6dGhpcy4kZyhhKX0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTG18fHNiLGJkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuU2E9YS5yZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuVGE9e307dGhpcy5RZj0hMTt0aGlzLldiPVtdfWMuamk9YjtiLnByb3RvdHlwZT17bnE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMubnEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLm9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxHdTpmdW5jdGlvbigpe3RoaXMuUWY9ITB9LEhnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxkZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2UuRChsLkFjLHRoaXMudS5CKCkpfSxOdDpmdW5jdGlvbigpe3RoaXMuUWZ8fCh0aGlzLnUucGxheSgpLGUuRChsLkJjLHRoaXMudS5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlNhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5TYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlNhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuU2Eub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5TYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5TYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUucmYoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5EZi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sb3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGFxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sRGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hcSh0aGlzLlNhKTsKaWYoYi54IT10aGlzLlRhLnh8fGIueSE9dGhpcy5UYS55fHxiLnBvc2l0aW9uIT10aGlzLlRhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlRhLndpZHRofHxiLmhlaWdodCE9dGhpcy5UYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5UYS53aWR0aCYmMDx0aGlzLlRhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmYoKTtyZXR1cm59dGhpcy5UYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuV2IubGVuZ3RoO2ErKyl0aGlzLldiW2FdKHt3aWR0aDpiLndpZHRoLApoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLkRmLmJpbmQodGhpcyksMTApfSxlbjpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy5XYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuV2IucHVzaChhKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTj1jLmppfHxOLEI9W10sdGI9MDsxMDA+dGI7dGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRxPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVs5XTt0aGlzLnpxPXRoaXMuYVs2XTt0aGlzLkVuPXRoaXMuYVsxXTt0aGlzLlVyPXRoaXMuYVs5XTt0aGlzLnduPXRoaXMuYVsxXTt0aGlzLmJ0PXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLmlwPXRoaXMuYVs3XTt0aGlzLmdpPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuT3M9YjtiLnByb3RvdHlwZT17WnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRxOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLnlxKGEpfSx5cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenE6dGhpcy5EbihhKX0sCkRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVXI6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnduOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idDp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHY6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmlwOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5naTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMuT3N8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLlpxKDQpOyhmdW5jdGlvbihjKXtjLnVrPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMua2UoYik7dGhpcy5lZigpfSxrZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKa2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy51a3x8dmI7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7CnRoaXMud2I9dGhpcy53Ynx8ITE7dGhpcy5OZT10aGlzLlFlPXRoaXMuSGY9dGhpcy5pYT10aGlzLnRlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTHAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRlPSEwO3RoaXMuSGYmJnRoaXMuWWUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudmMoKTsKdGhpcy5IZj0hMDt0aGlzLlllKCl9LmJpbmQodGhpcykpO3RoaXMuVWUoKX0sWWU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy52YygpO2lmKCF0aGlzLnRlJiYhdGhpcy52YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudGUmJnRoaXMuTmUmJiF0aGlzLlFlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHdmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApVZTpmdW5jdGlvbigpe2lmKHRoaXMudmMoKSl7dmFyIGI9dGhpcy53ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlFlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuTmU9Yi55d310aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZSgpfS5iaW5kKHRoaXMpLDEwMCl9LEZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlN3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxrcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxMcDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpjKCl9LmJpbmQodGhpcyksMTAwKX0semM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5RYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmtxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCnRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk9rLkltLkdtP3dpbmRvdy5PTy5Pay5JbS5HbS53dyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cigpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMudmt8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQW89dGhpcy5hWzhdO3RoaXMua3I9dGhpcy5hWzhdO3RoaXMuTHU9dGhpcy5hWzNdO3RoaXMuUWs9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy52cz1iO2IucHJvdG90eXBlPXt6bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW86dGhpcy5qcihhKX0sanI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtyOnRoaXMuS3UoYSl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB6Yj1jLnZzfHx6YixkZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1kZC56byg0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMudmx8fFU7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkudGQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuSXMoYSl9LmJpbmQodGhpcykpO3kuRHEoKX0sSXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLnVsfHxWOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLlZjJiYoYj1lLmFwKGIsdGhpcy5WYykpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLAoiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGJbYV0pLGQ9bmV3IFUoaCksdGhpcy5IKGQpfHwodGhpcy5KKGQpLGY9bmV3IFYoZCx0aGlzLkEpLGYuYigpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sdGQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2JdfHwodGhpcy5hYVtiXT17fSk7dGhpcy5hYVtiXVthXXx8KHRoaXMuYWFbYl1bYV09W10pO3RoaXMuYWFbYl1bYV0ucHVzaChjKX0sWnU6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5hYXx8CnRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuYmN8fCh0aGlzLmJjPVtdKSx0aGlzLmJjLnB1c2goYiksdGhpcy5MdCgpJiYodGhpcy5sZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYwPHRoaXMuYWFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYV1bY11bZF0oYil9fSxEcTpmdW5jdGlvbigpe2lmKHRoaXMuYmMpZm9yKHZhciBiPTA7Yjx0aGlzLmJjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuYmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuYWFbY11bZF1bZl0oYSl9fSwKdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5adShiKX19KX0pKGMpO3ZhciBBYj1jLndsfHxBYix5PW5ldyBBYihxKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLmptPXRoaXMuYVsyXTt0aGlzLnFsPXRoaXMuYVs1XTt0aGlzLmxzPXRoaXMuYVszXTt0aGlzLmVvPXRoaXMuYVs0XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLktsPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJGk6CnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Rajp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFsOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sczp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW86dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51aTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLktsfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5GbCg0KTsoZnVuY3Rpb24oYyl7Yy5NaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPQohMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxrYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLk1ofHxDYjsoZnVuY3Rpb24oYyl7Yy5OaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucXR8fCh0aGlzLnF0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5OaHx8RGI7KGZ1bmN0aW9uKGMpe2MuT2g9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLAp0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy55YSlpZihhPT10aGlzLnlhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5PaHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs2XTt0aGlzLmFpPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzhdfWMubWs9YjtiLnByb3RvdHlwZT17dWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZoOnRoaXMuJGgoYSl9LCRoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5haTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdiPWMubWt8fApHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5sbT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEhiPWMubG18fEhiOyhmdW5jdGlvbihjKXtjLmttPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuU2V8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLlZwfHwodGhpcy5JZigpLAp0aGlzLlZwPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLlNlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5TZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxZcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sSWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLllwKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5pYT0hMCx0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLm8oKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZigpfS5iaW5kKHRoaXMpLDUwKX0sUXc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSGIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBJYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEpiPWMubW18fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SaD10aGlzLmFbMV07dGhpcy5ydT10aGlzLmFbNF07dGhpcy5oaD10aGlzLmFbOF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5waD10aGlzLmFbNF07dGhpcy5xaz10aGlzLmFbOV07dGhpcy56dT10aGlzLmFbOF07dGhpcy55bj10aGlzLmFbNl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5lcj10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e1FoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUmg6dGhpcy5xdShhKX0scXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ1OnRoaXMuZ2goYSl9LGdoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5oaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU246dGhpcy5vaChhKX0sCm9oOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5waDp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucWs6dGhpcy55dShhKX0seXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnp1OnRoaXMueG4oYSl9LHhuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bjp0aGlzLm53KGEpfSxudzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub3c6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgTGI9Yy5Obnx8TGIsZ2Q9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuUWgoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXIoInBsYXllclBsYXlFbmQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5bGlzdFBsYXlOZXh0IixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuRGp8fE1iOyhmdW5jdGlvbihjKXtjLkNqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IixmdW5jdGlvbigpe3RoaXMubmYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm5mKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLmJuKCl9LmJpbmQodGhpcykpLHRoaXMuU2c9ITEsdGhpcy5Sdj0xRTMsdGhpcy5mZz17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG5mOmZ1bmN0aW9uKCl7dGhpcy5mZy5kb25lfHwodGhpcy5mZy5kb25lPSEwLHRoaXMuU2c9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksdGhpcy5SdikpfSxibjpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5TZyk7dGhpcy5tKCl9LFJnOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksdGhpcy53KCkpfSx0ZjpmdW5jdGlvbihiKXt2YXIgYT1bXTtpZihiKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJmJbY11bZF0mJmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZj1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7CmEucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLnRmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMudGYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwO3JldHVybiExfX0pfSkoYyk7dmFyIE5iPWMuQ2p8fE5iOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj0KbnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjJiYoYz1uZXcgTWIoYyksdGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgTmIoYyx0aGlzLkEpKS5iKCkpKX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2I9Yy5Fanx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNzPXRoaXMuYVs1XTsKdGhpcy54aj10aGlzLmFbMl07dGhpcy5tdj10aGlzLmFbMl07dGhpcy56aj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5CaD10aGlzLmFbMV07dGhpcy5ybz10aGlzLmFbOF07dGhpcy5RaT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLlFuPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dczp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueGo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm12OnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuemo6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktuOnRoaXMuQWgoYSl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CaDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm86dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5RaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIFFiPWMuUW58fFFiLGhkPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLkJzKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgUmI9Yy5zbHx8UmI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5MZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGQoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLAoiSU1BIiksdGhpcy5vKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTApfSxMZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5ybHx8U2I7KGZ1bmN0aW9uKGMpe2MudGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgUmIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFNiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBUYj1jLnRsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzhdO3RoaXMuQm09dGhpcy5hWzddO3RoaXMucWo9dGhpcy5hWzEwXTt0aGlzLmR0PXRoaXMuYVsxXTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVs4XTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLk51PQp0aGlzLmFbMl07dGhpcy5nPXRoaXMuYVs3XX1jLkpzPWI7Yi5wcm90b3R5cGU9e0J2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLkFtKGEpfSxBbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJtOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xajp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHQ6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RcDp0aGlzLm92KGEpfSxvdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnB2OnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5GbTp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHA6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk51OnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFZiPWMuSnN8fFZiLGlkPW5ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkJ2KDQpOyhmdW5jdGlvbihjKXtjLmFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5QKGIpO3RoaXMuUyhiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmFlPSExfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy50dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpOwpiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LER1OmZ1bmN0aW9uKCl7dGhpcy5hZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFdiPWMuYWx8fFdiOyhmdW5jdGlvbihjKXtjLiRrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5LYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5qcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuS2J8fCh0aGlzLktiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLktifHx0aGlzLktiKyssdGhpcy5LYjw9dGhpcy5qcz8odGhpcy5LYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKX0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRHUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFhiPWMuJGt8fFhiOyhmdW5jdGlvbihjKXtjLmJsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBXYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBYYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFliPWMuYmx8fFliLFpiPW5ldyBZYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5waT10aGlzLmFbOV07dGhpcy5wdT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkRzPWI7Yi5wcm90b3R5cGU9e29pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5waTp0aGlzLm91KGEpfSxvdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucHU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOgphfX19KShjKTt2YXIgJGI9Yy5Ec3x8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQub2koNCk7KGZ1bmN0aW9uKGMpe2MuV2s9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy5Xa3x8YWM7KGZ1bmN0aW9uKGMpe2MuVms9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRGEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMub2IoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5QbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkxjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5OcigpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxQbzpmdW5jdGlvbigpe3RoaXMuTWUoKXx8dGhpcy5vKCEwKX0sTnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7IWIubWEmJgpiLmJhJiZiLnZ3JiZiLnh3JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmcpZm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkRhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PQphJiYodGhpcy5iZz1iW2NdKTtyZXR1cm4gdGhpcy5iZ30sTGQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuTGMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKTp0aGlzLncoKTp0aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmM9Yy5Wa3x8YmM7KGZ1bmN0aW9uKGMpe2MuWGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5wbGF5ZXJhcGkpe3ZhciBiPWsucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgYWMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBjYz1jLlhrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzJdO3RoaXMucnY9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy5vbD1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZwOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HaTp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3I6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm5sOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucnY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLm9sfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5FcCg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApwYXVzZTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJgoodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9Yy5aanx8VzsoZnVuY3Rpb24oYyl7Yy5Zaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5iZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLmJlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuYmUmJmIhPXRoaXMuYmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5VdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWD1jLllqfHxYOyhmdW5jdGlvbihjKXtjLiRqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBXKGIpLGIuamE/dGhpcy5sZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBYKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCxmYz1jLiRqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5wYi5sZW5ndGgpe3ZhciBhPW0ucGIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuVmYuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlZmKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudHY9dGhpcy5hWzJdO3RoaXMuZXM9dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzZdO3RoaXMuUHU9dGhpcy5hWzJdO3RoaXMuQXA9dGhpcy5hWzZdO3RoaXMuc2k9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbN119Yy55cD1iO2IucHJvdG90eXBlPXtzdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVzOnRoaXMuYnYoYSl9LGJ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5jdjp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlB1OnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcDp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc2k6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLnlwfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5zdig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUChhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYz8odGhpcy5TKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy54cz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sWHQ6ZnVuY3Rpb24oYil7dGhpcy5xZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54c30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLnFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5xZCYmKG5ldyBHKHRoaXMsdGhpcy5xZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLklsfHxNOyhmdW5jdGlvbihjKXtjLkhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5EZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJgp3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLmd1KCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwKMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLGEpKTpiLmwoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEc9Yy5IbHx8RzsoZnVuY3Rpb24oYyl7Yy5KbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy54YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkgoYil8fAoodGhpcy5KKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYi5YdCh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgaWM9Yy5KbHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaD10aGlzLmFbOV07dGhpcy4kbD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5ncz10aGlzLmFbMl07dGhpcy5maD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLm5vPWI7Yi5wcm90b3R5cGU9e0toOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaDp0aGlzLlpsKGEpfSxabDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56aTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdzOnRoaXMuZWgoYSl9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5maDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPQpjLm5vfHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5LaCg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5iZj0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5TKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iZn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksCjQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuYmY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3lvOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5Vanx8bGM7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWXc6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQmUobmV3IGZ1bmN0aW9uKCl7fSk7CmEuc3c9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuRnQoYSk7d2luZG93LkF3PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0fHwodGhpcy5FdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLklkfHwodGhpcy5JZD0xKTtpZigyMDx0aGlzLklkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTsKcmV0dXJufXRoaXMuSWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTsKd2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT0KdHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0saGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMuVGp8fG1jOyhmdW5jdGlvbihjKXtjLlZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgbmM9Yy5Wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5zPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzhdfWMubnQ9YjtiLnByb3RvdHlwZT17TXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5zOnRoaXMud3EoYSl9LHdxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLm50fHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Ncyg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpO2EmJnRoaXMuUChhLnBhcmVudE5vZGUpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpOwp2YXIgWT1jLkxqfHxZOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkVmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5XYT10aGlzLnNjPSExO3RoaXMuamc9ZS5sYigxMCk7dGhpcy5OZigpfSxOZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuSGEoKSwhMDt0aGlzLkVmKys7aWYoMTA8dGhpcy5FZil0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5vKCEwKToKdGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLAoyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5Lanx8WjsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYKKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5xPXRoaXMuYVsyXTt0aGlzLktxPXRoaXMuYVs0XTt0aGlzLnNuPXRoaXMuYVsxXTt0aGlzLlVrPXRoaXMuYVsxXTt0aGlzLlB0PXRoaXMuYVs4XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNF07dGhpcy5hdj10aGlzLmFbMTBdO3RoaXMuem09dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNl19Yy5Hcj1iO2IucHJvdG90eXBlPXtNcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk5xOnRoaXMuSnEoYSl9LEpxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LcTp0aGlzLnJuKGEpfSxybjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLnNuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWs6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnZvKGEpfSx2bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud286dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmF2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56bTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMuR3J8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLk1xKDQpOyhmdW5jdGlvbihjKXtjLk5pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5QKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5OaXx8dGM7KGZ1bmN0aW9uKGMpe2MuTWk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksCnRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5NaXx8dWM7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRWEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7CmVsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgdmM9Yy5PaXx8dmMsd2M9bmV3IHZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVszXTt0aGlzLkN0PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVs0XTt0aGlzLlZxPXRoaXMuYVszXTt0aGlzLlp2PXRoaXMuYVs1XTt0aGlzLmJtPXRoaXMuYVsyXTt0aGlzLlhvPXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuSGo9YjtiLnByb3RvdHlwZT17U3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DdDp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSms6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMuWXYoYSl9LApZdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWnY6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ibTp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhvOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ZcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHhjPWMuSGp8fHhjLHBkPW5ldyB4YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXBkLlNxKDQpOyhmdW5jdGlvbihjKXtjLlVpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuUChiKSx0aGlzLlMoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciB5Yz1jLlVpfHx5YzsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5XZSgpfSxXZTpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2UoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIHpjPWMuVGl8fHpjOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIuamEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5IKGIpKXt0aGlzLkooYik7KG5ldyB6YyhiLHRoaXMuQSkpLmIoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIEFjPWMuVml8fEFjLEJjPW5ldyBBYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbOV07dGhpcy5Dbj10aGlzLmFbNl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs5XX1jLkdoPWI7Yi5wcm90b3R5cGU9CntYbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW46dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlV0OnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLkJuKGEpfSxCbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ246dGhpcy5pbyhhKX0saW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5HaHx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuWG4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUGY9dGhpcy5TZj10aGlzLlJmPSExO3RoaXMuWGM9W107dGhpcy5mZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT0KdHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRhP251bGw6VGEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBZYT9udWxsOllhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLApiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgY2I/bnVsbDpjYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaGI/bnVsbDpoYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE9hP251bGw6T2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHBhP251bGw6cGF9fWMuTWs9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5tcShhKTpbXSxiO3RoaXMuU2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuUmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMubWcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmZlKXtpZih0aGlzLlBmKWJyZWFrO2I9dGhpcy5mZVtjXTt0aGlzLnZlKGIpJiYodGhpcy5YYy5wdXNoKGIpLHRoaXMubWcoYikpfX0sdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxtcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5mZVtjXSx0aGlzLnZlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEpe3RoaXMudmUoYSkmJmEuYigpfSxGdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YKcCYmIXRoaXMuUmYpZm9yKHRoaXMuUGY9ITAsYT0wO2E8dGhpcy5YYy5sZW5ndGg7YSsrKXRoaXMuWGNbYV0uc2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5YY1thXS5zYil9fX0pKGMpO3ZhciBEYz1jLk1rfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YZz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLldpPWI7Yi5wcm90b3R5cGU9e1dnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLldpfHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5XZyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuVGIobC52diksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuVGIobC5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTsKdmFyIHNkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZWE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IFEsaz0hMTtGLlliKCk7Ri5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuWWIoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkpmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5ZYigpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxGLmxyKCkse2lkOnRkfSl9LDUwMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dT10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbMTBdO3RoaXMuVW49dGhpcy5hWzVdOwp0aGlzLnlrPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzddfWMuSHE9YjtiLnByb3RvdHlwZT17c3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnR1OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TaTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQmo6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlVuOnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLkhxfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC5zdSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuaGc9dGhpcy5jb25mPXRoaXMuVmE9CnRoaXMucGxheWVyPW51bGw7dGhpcy5TYz0wO3RoaXMuTmE9IiI7dGhpcy5ZYz1bXTt0aGlzLlpjPTA7dGhpcy5pZz0hMTt0aGlzLmNlPVtdfWMuVWc9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5oZz1hfSxhZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuTmE9dGhpcy5wbGF5ZXIuTCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFp0OmZ1bmN0aW9uKGEpe3RoaXMuVmE9YX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuTGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLlZhKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMubXIoKSl0aGlzLlZhLmModGhpcy5WYS5OYyx0aGlzLlZhLkJhLHRoaXMuVmEuZWUsZnVuY3Rpb24oKXt0aGlzLmRjKGEsYil9LmJpbmQodGhpcyksdGhpcy5WYS5EYyk7ZWxzZSBpZih0aGlzLkZxKCkpdGhpcy5RdChmdW5jdGlvbigpe3RoaXMuZGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChsLkFjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkd1KCk7ay5leGl0RnVsbHNjcmVlbigpO1I9az1uZXcgTyhrLAp0aGlzLlZhLGgpO2sucGcodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX1hPXRoaXMuaHMoYSk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk1kJiYoYz10aGlzLnBsYXllci5NZCgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5PZChhLGMsZik7dGhpcy5wbGF5ZXIucWcoayl9fSxtcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlNjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuU2MuZ2V0VGltZSgpLHRoaXMuU2M9YSwzRTU8Yj8hMDohMTt0aGlzLlNjPWE7cmV0dXJuITF9LHZ1OmZ1bmN0aW9uKCl7ZS5qZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudWEoImFkVGFnIik7dGhpcy51YSgicHJlcm9sbEFkVGFnIikmJgooYT10aGlzLnVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5qZihhKSk/dGhpcy5kYyhhKTooc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX0sdXU6ZnVuY3Rpb24oYSl7ZS5qZSgicG9zdHJvbGwiKTtpZighdGhpcy5oZyl7dGhpcy5kdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZihjKSk/dGhpcy5kYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKSl9fSxqZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9CmEoYil9cmV0dXJuIGF9LEh0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaXUodGhpcy51dS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5lYSgpfSxjZDpmdW5jdGlvbihhKXtlLmplKCJtaWRyb2xsIik7aWYoIXRoaXMuWGYpe3RoaXMuWGY9ITA7dmFyIGI9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy51YSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuZGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGY9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX19LEd0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5TZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy52dSgpO3RoaXMucGxheWVyLlNkJiZ0aGlzLkd0KCk7dGhpcy5IdCgpfSxJdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5ZYy5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLlpjPXRoaXMuWWMubGVuZ3RofSxGcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5aYyYmKGE9ITApO3JldHVybiBhfSxRdDpmdW5jdGlvbihhKXt0aGlzLmlnPWE7Zm9yKGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdWyJmdW5jdGlvbiJdKHRoaXMud3QuYmluZCh0aGlzKSl9LHd0OmZ1bmN0aW9uKGEpe3RoaXMuWmMtLTthJiZ0aGlzLmNlLnB1c2goYSk7MD49dGhpcy5aYyYmdGhpcy5pZygpfSxoczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5jZS5sZW5ndGg7YysrKWI9CnRoaXMuY2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuVWd8fGdhLFI9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnI9dGhpcy5hWzEwXTt0aGlzLm9wPXRoaXMuYVszXTt0aGlzLnJoPXRoaXMuYVs2XTt0aGlzLmRtPXRoaXMuYVs2XTt0aGlzLmx1PXRoaXMuYVszXTt0aGlzLnB0PXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVsxMF07dGhpcy5obz10aGlzLmFbMTBdO3RoaXMuUm09dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzhdfWMudmk9YjtiLnByb3RvdHlwZT17YXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJyOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5xaChhKX0scWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJoOnRoaXMuY20oYSl9LApjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmRtOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sdTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHQ6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRoOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYz1jLnZpfHxHYyx2ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj12ZC5hcig0KX0pLmNhbGwobmFlR2hhaVRFaWtlaXNpZSxuYWVHaGFpVEVpa2Vpc2llKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.151.243 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.243.151.251.148.clients.your-server.de
Software
AmazonS3 /
Resource Hash
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e

Request headers

Pragma
no-cache
Origin
https://www.chip.de
Accept-Encoding
gzip, deflate
Host
ssl.3.damoh.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Connection
keep-alive
Content-Length
86
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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
Mon, 10 Sep 2018 14:28:39 GMT
Connection
keep-alive
Content-Length
422
Last-Modified
Tue, 07 Aug 2018 07:40:11 GMT
Server
AmazonS3
Etag
"2f988edff393a29c96e2df9109950ab1"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.chip.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de6-homad-1
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.chip.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
jsapi
s.d.adup-tech.com/ Frame 976F
37 KB
270 B
Script
General
Full URL
https://s.d.adup-tech.com/jsapi
Requested by
Host: s.d.adup-tech.com
URL: https://s.d.adup-tech.com/ads/display.js?p=b0a301db334008753f83ff78ea6764f9
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.150.113 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-113.fra53.r.cloudfront.net
Software
nginx /
Resource Hash
8778ba53b998ae44cb9a271b72c299b2bf539ac1b33ca360e7bc10253698b850

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
If-None-Match
3fcf5eeb08ed0cd46045b73bef6d0b84
If-Modified-Since
Mon, 10 Sep 2018 11:53:38 GMT
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:38 GMT
via
1.1 1015c68f2d8c45924ae7198c984dcdde.cloudfront.net (CloudFront)
server
nginx
age
3049
etag
3fcf5eeb08ed0cd46045b73bef6d0b84
x-cache
Hit from cloudfront
status
304
cache-control
max-age=3600
x-amz-cf-id
j8_x_ZFrcq2fCMOLy9fuIMudoTCLwHy5xtWI7Jc6IzGmzlNI2-skUA==
expires
Mon, 10 Sep 2018 13:37:49 GMT
truncated
/ Frame 976F
211 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
a0e44788e4f67a669b3e7f76e40ef57b5e6f5a6e647a5c68500520f58654d904

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
amp4ads-host-v0.js
cdn.ampproject.org/rtv/011535566825959/
20 KB
9 KB
Script
General
Full URL
https://cdn.ampproject.org/rtv/011535566825959/amp4ads-host-v0.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ffd863adce73bcd5ecb00753cb264120d71714252835f94e336b5f2a842eb81c
Security Headers
Name Value
Content-Security-Policy default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
Strict-Transport-Security max-age=31536000; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

content-security-policy
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
content-encoding
gzip
x-content-type-options
nosniff
age
409439
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
8042
x-xss-protection
1; mode=block
last-modified
Wed, 29 Aug 2018 20:15:00 GMT
server
sffe
date
Wed, 05 Sep 2018 20:44:39 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
content-type
text/javascript
access-control-allow-origin
*
vary
Accept-Encoding
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 05 Sep 2019 20:44:39 GMT
amp4ads-v0.js
cdn.ampproject.org/rtv/011535566825959/ Frame E65B
260 KB
83 KB
Script
General
Full URL
https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
46ab33a1c2d56dc8299e8bef5c29466ae9356a4515ddd449a0bfc05aa5e84af8
Security Headers
Name Value
Content-Security-Policy default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
Strict-Transport-Security max-age=31536000; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

content-security-policy
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
content-encoding
gzip
x-content-type-options
nosniff
age
1005549
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
84387
x-xss-protection
1; mode=block
last-modified
Wed, 29 Aug 2018 20:15:00 GMT
server
sffe
date
Wed, 29 Aug 2018 23:09:29 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
content-type
text/javascript
access-control-allow-origin
*
vary
Accept-Encoding
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 29 Aug 2019 23:09:29 GMT
amp-analytics-0.1.js
cdn.ampproject.org/rtv/011535566825959/v0/ Frame E65B
110 KB
35 KB
Script
General
Full URL
https://cdn.ampproject.org/rtv/011535566825959/v0/amp-analytics-0.1.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
670506f73688fc179c5821d61cde38f34a52bb20a32021272d6216bb88488830
Security Headers
Name Value
Content-Security-Policy default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
Strict-Transport-Security max-age=31536000; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

content-security-policy
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
content-encoding
gzip
x-content-type-options
nosniff
age
612582
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
35847
x-xss-protection
1; mode=block
last-modified
Wed, 29 Aug 2018 20:15:00 GMT
server
sffe
date
Mon, 03 Sep 2018 12:18:56 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
content-type
text/javascript
access-control-allow-origin
*
vary
Accept-Encoding
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Tue, 03 Sep 2019 12:18:56 GMT
18189169834422979202
tpc.googlesyndication.com/simgad/ Frame E65B
48 KB
48 KB
Image
General
Full URL
https://tpc.googlesyndication.com/simgad/18189169834422979202
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
af71e5d84379e977c529d7f2e90751cd55d9303cd9072c934624ddc6828cf34f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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 13:37:25 GMT
x-content-type-options
nosniff
age
262273
x-dns-prefetch-control
off
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
48830
x-xss-protection
1; mode=block
last-modified
Fri, 07 Sep 2018 13:30:28 GMT
server
sffe
content-type
image/gif
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Sat, 07 Sep 2019 13:37:25 GMT
B10860715.145163035;dc_pre=CNzT-eLSsN0CFY4m4Aod7k8K2A;dc_trk_aid=316834343;dc_trk_cid=78556514;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=
ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/ Frame E65B
Redirect Chain
  • https://t.myvisualiq.net/impression_pixel?r=438922656&et=i&ago=212&ao=537&aca=10860715&si=3230043&ci=78556514&pi=145163035&ad=-18&advt=5862390&chnl=-18&vndr=115&sz=9112&u=-18&pt=i&red=https%3A%2F%2...
  • https://t.myvisualiq.net/ul_cb/impression_pixel?r=438922656&et=i&ago=212&ao=537&aca=10860715&si=3230043&ci=78556514&pi=145163035&ad=-18&advt=5862390&chnl=-18&vndr=115&sz=9112&u=-18&pt=i&red=https%3...
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860715.145163035;dc_trk_aid=316834343;dc_trk_cid=78556514;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860715.145163035;dc_pre=CNzT-eLSsN0CFY4m4Aod7k8K2A;dc_trk_aid=316834343;dc_trk_cid=78556514;ord=[timestamp];dc_lat=;dc_rdid=;tag_for...
42 B
120 B
Image
General
Full URL
https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860715.145163035;dc_pre=CNzT-eLSsN0CFY4m4Aod7k8K2A;dc_trk_aid=316834343;dc_trk_cid=78556514;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
172.217.21.198 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f198.1e100.net
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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:39 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
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
no-cache, must-revalidate
content-type
image/gif
alt-svc
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

Redirect headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:39 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
302
content-type
text/html; charset=UTF-8
location
https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860715.145163035;dc_pre=CNzT-eLSsN0CFY4m4Aod7k8K2A;dc_trk_aid=316834343;dc_trk_cid=78556514;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=;tfua=?
cache-control
no-cache, must-revalidate
follow-only-when-prerender-shown
1
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame E65B
0
56 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssRaQi12EEYdToPAZtwzbTI9BXX935hhG_HUK9uC_32Q7g745Fjy3ejcGeokdmdOTuJlgxFHKtbTXK7DfyQJbj--A4VrjeEUJFwy8Dm7dYgSi75FMNUl6A8y9eLxc_FyUEqmBeB2iGdxx1iEvWLw65LiZK55anWxRzV22M95OKe-dvDELH1pNGLFY5witmGw25ldctgQrCLD5Pn8kdHlBuTlOyuCroPxqHLb2Ot0FC0bZnxG5bgIpq4zdvIK_I3Ba2eqtF8DTqU2lvD-Q7uBPX_qUO_simqPcU4HMYQ&sai=AMfl-YSrmosQBS6IHWg-JFS95AXXowkUvrKjFU_t8kgm-KbsPtXvRogZSD4cfOImaMOpsV75YahaBuOk8eDY1hQ3NSO6jOdcUqY4jxFmWr5Sl3XCOTs5YCBzsYTsb2w&sig=Cg0ArKJSzJyWDjCsezOpEAE&adurl=
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:38 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
l
www.google.com/ads/measurement/ Frame E65B
0
71 B
Image
General
Full URL
https://www.google.com/ads/measurement/l?ebcid=ALh7CaTY5obF8tUUMeY2xLxRPKIXhTVRF880rjNCLJ4Uyuok1kGyCbhmBDV-DdizHzTcmBuflZPkncoLutPaP9H6ro7t8P0QUg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81f::2004 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

content-type
text/html; charset=UTF-8
select
ad.sxp.smartclip.net/
8 KB
2 KB
XHR
General
Full URL
https://ad.sxp.smartclip.net/select?type=dyn&ple=burda.chip.intxt.de.smartclip~~400x320&fwd_dt1=&cu_ress=downloads&fwd_dt2=&fwd_sz=400x320&ang_ref=https://www.chip.de/downloads/Android-File-Transfer_53192185.html&x=9&d1=2&d10=5&d11=0&d12=2&d2=4&d3=5&d4=0&d7=1&d8=1&d9=2&d13=4&d14=0&d15=4&d16=0&d18=0&i9=4&i13=3&i3=2&i21=4&i1=3&i14=4&i8=4&g1=0&g2=1&g3=0&g4=0&g5=1&n1=1&n2=1&n3=1&n4=0&n5=1&n6=1&n7=0&n8=1&n9=0&sinbest=5&s1=0&s2=0&survey_cap=1&frq_n=1&oneclicker=1&qualified=0&tv=2&ct_gnd=0&ct_qvc=0&d20=4&ct_agraf=0&ct_qc=0&nuggsid=474493238&ang_contxt=1&inswipe=true&optout=&consent=&optout=&consent=&rnd=38116368
Requested by
Host: dco.smartclip.net
URL: https://dco.smartclip.net/?plc=92747
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
176.34.121.0 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-176-34-121-0.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
59495fbc81066e3a85739c38ba73d8724e9195f48f664e911ddbd92c64647726

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 14:28:39 GMT
Content-Encoding
gzip
Sc-Supply-Network
1
Vary
Accept-Encoding
P3P
CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
Access-Control-Allow-Origin
https://www.chip.de
Sc-Uuid
bebff81c-fee1-406f-8a90-58924ce2655b
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/xml; charset=utf-8
Sc-Device-Type
PC
Content-Length
1634
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_fm6che7o/v/1/flavorId/1_ullm0yuj/name/
320 KB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_fm6che7o/v/1/flavorId/1_ullm0yuj/name/a.mp4
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:path
/p/1741931/sp/174193100/serveFlavor/entryId/1_fm6che7o/v/1/flavorId/1_ullm0yuj/name/a.mp4
pragma
no-cache
cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964; s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]; __gads=ID=78a6ac6d7af67528:T=1536589718:S=ALNI_MYvYVimTcb8GVmRj4yhsb2D8tOpVg
accept-encoding
identity;q=1, *;q=0
user-agent
Mozilla/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
*/*
cache-control
no-cache
:authority
videos.chip.de
referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
:scheme
https
range
bytes=131072-
:method
GET
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Range
bytes=131072-

Response headers

date
Mon, 10 Sep 2018 14:28:38 GMT
access-control-allow-methods
GET, HEAD, OPTIONS
x-vod-session
860765434
status
206
Content-Length
6939174
Content-Range
bytes 131072-7070245/7070246
last-modified
Sun, 19 Nov 2000 08:52:00 GMT
server
nginx
etag
"3a1794b0-6be226"
x-vod-me
ny-front-vod17
content-type
video/mp4
access-control-allow-origin
*
access-control-expose-headers
Server,Content-Length,Content-Range,Date
cache-control
max-age=8640000
accept-ranges
bytes
access-control-allow-headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
expires
Wed, 19 Dec 2018 14:28:38 GMT
csi
csi.gstatic.com/
0
202 B
Other
General
Full URL
https://csi.gstatic.com/csi?v=2&s=ima&dmc=8&puid=1~jlwduevl&c=8700347705467&e=668123008&alt=0&fb=ima-html5&sdkv=h.3.234.1&pid=3673&ppt=videojs-ima&ppv=1.5.1&mrd=8&aab=1&itv=1&met.4=ar.10r~vl.1ee&rcid=goog_404978636
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:400c:c0b::5e , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:39 GMT
last-modified
Wed, 21 Jan 2004 19:51:30 GMT
server
Golfe2
status
204
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
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
iframe
d.adup-tech.com/ Frame E66A
0
0
Document
General
Full URL
https://d.adup-tech.com/iframe?p=b0a301db334008753f83ff78ea6764f9&s=1&f=01&id=76tduf7t&uid=ssJ06O6P0-ln-WDt1W8P&surl=www.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html
Requested by
Host: s.d.adup-tech.com
URL: https://s.d.adup-tech.com/jsapi
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.14.76 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-14-76.eu-west-1.compute.amazonaws.com
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
d.adup-tech.com
:scheme
https
:path
/iframe?p=b0a301db334008753f83ff78ea6764f9&s=1&f=01&id=76tduf7t&uid=ssJ06O6P0-ln-WDt1W8P&surl=www.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.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.chip.de/downloads/Android-File-Transfer_53192185.html
accept-encoding
gzip, deflate
cookie
uid=ssJ06O6P0-ln-WDt1W8P
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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html

Response headers

status
200
date
Mon, 10 Sep 2018 14:28:40 GMT
content-type
text/html; charset=utf-8
server
nginx
p3p
policyref="/w3c/p3p.xml", CP="OTC NOI DSP COR PSAo PSDo IVAo IVDo OTPo OUR IND"
set-cookie
uid=ssJ06O6P0-ln-WDt1W8P; Domain=.d.adup-tech.com; Expires=Tue, 10-Sep-2019 14:28:40 GMT; Path=/
content-encoding
gzip
iframe
d.adup-tech.com/ Frame AC99
0
0
Document
General
Full URL
https://d.adup-tech.com/iframe?p=69139504101a193487ed1eb4af979f65&s=1&f=01&id=4dwduf64&uid=ssJ06O6P0-ln-WDt1W8P&surl=www.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html
Requested by
Host: s.d.adup-tech.com
URL: https://s.d.adup-tech.com/jsapi
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.14.76 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-14-76.eu-west-1.compute.amazonaws.com
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
d.adup-tech.com
:scheme
https
:path
/iframe?p=69139504101a193487ed1eb4af979f65&s=1&f=01&id=4dwduf64&uid=ssJ06O6P0-ln-WDt1W8P&surl=www.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.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.chip.de/downloads/Android-File-Transfer_53192185.html
accept-encoding
gzip, deflate
cookie
uid=ssJ06O6P0-ln-WDt1W8P
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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html

Response headers

status
200
date
Mon, 10 Sep 2018 14:28:39 GMT
content-type
text/html; charset=utf-8
server
nginx
p3p
policyref="/w3c/p3p.xml", CP="OTC NOI DSP COR PSAo PSDo IVAo IVDo OTPo OUR IND"
set-cookie
uid=ssJ06O6P0-ln-WDt1W8P; Domain=.d.adup-tech.com; Expires=Tue, 10-Sep-2019 14:28:39 GMT; Path=/
content-encoding
gzip
/
farm.plista.com/video/vast/
119 B
771 B
XHR
General
Full URL
https://farm.plista.com/video/vast/?publickey=17931c374bc18a64718fdba5&widgetname=outstream_vast_3&vastver=3.0&playback_method=hover_sound_on
Requested by
Host: dco.smartclip.net
URL: https://dco.smartclip.net/?plc=92747
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a01:4f8:202:42d4::2 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
51a92d0800cd66f6bf20e50b043d49f2fefa9dc368ae442a57a95e10edbd63bd

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:39 GMT
content-encoding
gzip
last-modified
Mon, 10 Sep 2018 14:28:39 GMT
server
nginx
status
200
access-control-allow-methods
GET, POST, OPTIONS
p3p
policyref="https://www.plista.com/w3c/p3p.xml", CP="CAO DSP COR TAIa PSAa PSDa IVAi IVDi CONi HISa OUR IND PHY ONL UNI COM NAV INT DEM STA PRE"
access-control-allow-origin
https://www.chip.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/xml; charset=utf-8
access-control-allow-headers
Origin, DNT, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Keep-Alive, Accept
content-length
127
expires
Mon, 26 Jul 1997 05:00:00 GMT
hic_qos
ssl.1.damoh.chip.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.chip.de/hic_qos?adv_partner&_werbebanner_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG5hZUdoYWlURWlrZWlzaWU9bmFlR2hhaVRFaWtlaXNpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuWGR8fCh5LlhkPTApO3kuWGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5YZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5wZyhrKSxhLk9kKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQWMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYWQoYyk7YS5adChtKTthLll0KGspO2EuSXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vaz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbN107dGhpcy5Rdj10aGlzLmFbOV07CnRoaXMuJG49dGhpcy5hWzddO3RoaXMucG49dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbMTBdfWMuV3E9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9rOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5BdDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3A6dGhpcy5QdihhKX0sUHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlF2OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy4kbjp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYT1jLldxfHxoYSxIYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9SGMubmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRmE9InNldHVwIjt0aGlzLmZjPVtdO3RoaXMuWmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy52dC5iaW5kKHRoaXMpKX1jLmZqPWI7Yi5wcm90b3R5cGU9e1plOmZ1bmN0aW9uKCl7dGhpcy5sYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGxuOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLAoiKiIpfSx6YTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sdnQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMudXQoYS5kYXRhKX0sdXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxhLmV2ZW50bGlzdGVuZXIubGVuZ3RoO2IrKylhLmV2ZW50PT10aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSx1ZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxhZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmZxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuVWYoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxmcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxqbjpmdW5jdGlvbihhLApiKXthPT1iJiYoKGI9dGhpcy5hZihhKSl8fChiPWEpKTswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGxmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIrKztyZXR1cm4gYn0sc2Y6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LEV1OmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LExmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LE1mOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAsYz0wLGg9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2Y9dS5oZWlnaHQ7MD51LnRvcCYmKGYrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJgooZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZik7aD49YiYmKGU9ITApO3JldHVybiBlfSxsYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxzZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxoPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PAoyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09ZChoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtjPWU7bj11O2w9azt3PUk7cT1tO2ZvcihmPTA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpKwpxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTYwOzc5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtlPWUrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0KKGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihmKT9lPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLApkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5vbz8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmCiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLmRmKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT17Rmg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sClBoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHdrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LG9tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxsbzpmdW5jdGlvbigpe3JldHVybiBhLkZoKCl8fGEuUGgoKXx8YS5McSgpfHxhLndrKCl8fGEub20oKX19O3JldHVybiBhLmxvKCl9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAsYz1hLmxlbmd0aDtmPGM7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0seWY6ZnVuY3Rpb24oYSl7YT10aGlzLk1hKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0samI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXA6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGYucHVzaChhW2NdKTtyZXR1cm4gZn0sQXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxwZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuR2coYikrIjoiK3RoaXMuR2coTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5GYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5GYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZixjKXt2YXIgaD1hO2QmJmImJihiPWwuSGMoYixkKSk7YiYmKGg9bC5IYyhhLGIpKTtmJiYoaD1sLkhjKGgsZikpO2MmJihoPWwuSGMoaCxjKSk7ZS5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlopd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLmdlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLkthKGYsITApO2Y9bS5LYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkdhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9CiExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFBkOmZ1bmN0aW9uKCl7bSYmbS5aP20uaXNFbmFibGVkJiZtLklvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBkKCl9LmJpbmQodGhpcyksNTAwKX0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToiIn0sTWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSx4bzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLlJjKGEpfHx0aGlzLnVyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5uZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5sZihhKSlyZXR1cm4gdGhpcy5sZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueWIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuTGEoYSxiLnZhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlBjKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLmpuKGMsYSk7cmV0dXJuIGN9LExhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlopaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLkthKGEsaCk7aD1rLkthKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09CmRbcV07cmV0dXJuIGsuR2EoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKGEsYixkLGYsYyxrLGUsdSl9LmJpbmQodGhpcyksNTAwKX0sVWY6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHU9ITA7ZSYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7Zm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LFlyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLlVmKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmZjKWZvcih2YXIgYyBpbiB0aGlzLmZjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnliKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sVmY6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07CmMuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuTGEoYSxmLnZhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ZcihmLlBjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mYz1hfSxldzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuTGEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsCmQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sbW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSwKYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxxcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5manx8UDtuZXcgUDt2YXIgZT1uZXcgUDt3aW5kb3cuRHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5laj1iO2IuSGM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLm10PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9OwpiLkJwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuJHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hbj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5WbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuWW09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuY249e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlVtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLldtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIiwKbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnl2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5DcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnY9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTm89e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Tbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IiwKbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLiRtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5abT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUGU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9lPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmRuPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5YbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IudnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLmVqfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmxsPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVsxXTt0aGlzLlRtPXRoaXMuYVs0XTt0aGlzLmxrPXRoaXMuYVs2XTt0aGlzLldsPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMuVXY9YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Jcjp0aGlzLm1pKGEpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmk6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uczp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlRtOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Vdnx8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuSHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5naj0KYjtiLnByb3RvdHlwZT17R2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxpcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHwKbmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sSWM6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkljKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSWMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxZYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkdkKHRoaXMuZmIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5JYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sbHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYigpKwoiMiJ9LEpmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuR2QodGhpcy5pcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkljKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUT1jLmdqfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnNtPXRoaXMuYVsxMF07dGhpcy5VcD10aGlzLmFbMl07dGhpcy5Ydj10aGlzLmFbMV07dGhpcy52cD10aGlzLmFbM107dGhpcy54bT10aGlzLmFbN107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5ScT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs3XX1jLnJwPWI7Yi5wcm90b3R5cGU9e3JtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlVwOnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnA6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhtOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ibzp0aGlzLlFxKGEpfSxRcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgamE9Yy5ycHx8amEsS2M9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2Mucm0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOgovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuYz9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLkJlPWJ9KShjKTt2YXIgSj1jLkJlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5paT10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLkNpPWI7Yi5wcm90b3R5cGU9e2hpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5paTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuQ2l8fGthLExjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUxjLmhpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuTGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy55YT17fTt0aGlzLkE9bnVsbDt0aGlzLmNjPTEwMDt0aGlzLm5iPTA7dGhpcy54YT0xNTA7dGhpcy5zYj0wO3RoaXMuJHQoYil9LGI6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhPyh0aGlzLm5iKyssdGhpcy5zYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmNjKSk6CjA+dGhpcy54YSYmKHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYykpfSxMdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5iPnRoaXMueGE/ITA6ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5uYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sJHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sSjpmdW5jdGlvbihiKXt0aGlzLnlhW2IuZmIoKV09YjtLJiZLLlNmJiZLLkZ1KGIpfSxMdzpmdW5jdGlvbigpe3JldHVybiBlLkVhKHRoaXMueWEpfSxIOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX0scnI6ZnVuY3Rpb24oYil7Yj1iLkRhKCk7Zm9yKHZhciBhIGluIHRoaXMueWEpaWYoYi5pZD09dGhpcy55YVthXS5EYSgpLmlkKXJldHVybiEwOwpyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Ma3x8cjsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmNjPTEwO3RoaXMubmI9MDt0aGlzLnhhPTUwO3RoaXMuSz1udWxsO3RoaXMuamE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmhiPSIiO3RoaXMuZmY9ITE7dGhpcy5OKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGc9dGhpcy5EYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9ZyliLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxOOmZ1bmN0aW9uKCl7fSxlYTpmdW5jdGlvbigpe30saXU6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LApNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuVGQ9Yn0sS3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UZH0sU2Q6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhJiYodGhpcy5uYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuY2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGtlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sJHc6ZnVuY3Rpb24oKXt9LFM6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuR3EoKXx8CnRoaXMuZm4oKTt0aGlzLmtlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sR3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFA6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGtiOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApUdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE1kOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHFnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sS3Q6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LFB3OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxWdzpmdW5jdGlvbigpe3RoaXMuZmZ8fCh0aGlzLmZmPSEwKX0sSmM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sR3c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuTmt8fHA7KGZ1bmN0aW9uKGMpe2MuVmc9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYiwKYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuS2U9IjEiO3RoaXMuTGU9IjIiO3RoaXMuSG09IjMiO3RoaXMua2M9MDt0aGlzLllmPTMwO3RoaXMudmI9W107dGhpcy5RYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlJlPXRoaXMuS2c9ITE7dGhpcy5zdGF0dXM9dGhpcy5rYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuYWQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLktnfHwodGhpcy5LZz0hMCxlLlBkKCkpfSxXZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1ImJlIuWmImJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5mdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLApnKSx0aGlzLkNnKCksdGhpcy5SZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlFhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxDZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMudmImJjA8dGhpcy52Yi5sZW5ndGgmJih0aGlzLnZiPWUudW5pcXVlKHRoaXMudmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnZiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUWEpe2Zvcih2YXIgZz0wO2c8dGhpcy5RYS5sZW5ndGg7ZysrKXRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPT10aGlzLkxiW2JdJiZhLnB1c2godGhpcy5RYVtnXS5kZXRhaWwpLHRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPHRoaXMuTGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlFhW2ddLmRldGFpbCksYj10aGlzLlFhW2ddLnJlYXNvbik7dGhpcy5MYltiXXx8KGI9InVua25vd24iLGE9W10pOwowPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxPdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkxlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LG9iOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5rY30sTWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2V9LHV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5rY30sYWQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxhdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSwKYXM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLlZnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLmZ0PXRoaXMuYVsxMF07dGhpcy5ObT10aGlzLmFbNF07dGhpcy5paz10aGlzLmFbNV07dGhpcy5RbD10aGlzLmFbNl07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy50aD10aGlzLmFbOV07dGhpcy5Ucz10aGlzLmFbNF07dGhpcy5Qbj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e2ZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nazp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5NbShhKX0sTW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5tOnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pazp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlFsOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWw6dGhpcy5zaChhKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRoOnRoaXMuU3MoYSl9LFNzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Uczp0aGlzLk9uKGEpfSxPbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWE9Yy5wb3x8bWEsTWM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuZmsoNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnJiKGIpfS5iaW5kKHRoaXMpKX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFM9Yy5kaXx8UzsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMua2Q9bnVsbDt0aGlzLkR2PTFFMzt0aGlzLmVnPW51bGw7dGhpcy5ldj0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub28pYi5vbigicGxheSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuTXAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLkNxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuQnEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkd2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5IdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFxKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5RbyhhKX0uYmluZCh0aGlzKSl9LFFvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sR3Y6ZnVuY3Rpb24oYil7dGhpcy5rZHx8KHRoaXMua2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkl2KGIpfS5iaW5kKHRoaXMpLAp0aGlzLkR2KSl9LEl2OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtkKTt0aGlzLncoKX0sSHY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2QpfSxBcTpmdW5jdGlvbihiKXt0aGlzLkJ3KGIpO3RoaXMuZWc9bmV3IERhdGU7dGhpcy5lZy10aGlzLnJ0PHRoaXMuZXY/dGhpcy53KCk6dGhpcy5tKCl9LENxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuYWQobmV3IFMoYSkpKTt0aGlzLncoKX0sTXA6ZnVuY3Rpb24oKXt9LEJxOmZ1bmN0aW9uKCl7dGhpcy5ydD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBuYT1jLmNpfHxuYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkVhKHZpZGVvanMucGxheWVycykpe3ZhciBiPQp2aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuZWl8fG9hLHBhPW5ldyBvYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Eaz10aGlzLmFbMV07dGhpcy5TbD10aGlzLmFbN107dGhpcy5LaT10aGlzLmFbM107dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVszXX1jLlFyPWI7Yi5wcm90b3R5cGU9e0NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Eazp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2w6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuSW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlFyfHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dayg0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3RoaXMua2YoKTt0aGlzLm1mKCk7dGhpcy5Sbz0hMX0sa2Y6ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy4kYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5QKGIpfSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLiRiKXt2YXIgYj10aGlzLkRhKCksCmE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuJGI9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpfSxjZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLlRkJiYoMCx0aGlzLlRkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxrYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxKYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLnNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxvYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmJiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMubWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLldkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5ZZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5vYigpLHRoaXMuZ2V0UGxheWVyKCkuUm89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmhiO2EmJihhLllkKCksYS5zYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5tYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2QoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLllmJiYhdGhpcy5oYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMub2MuaW5kZXhPZihhKSYmdGhpcy5vYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm9jLmxlbmd0aD49dGhpcy5zZCYmdGhpcy5vKCkpfSxhczpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkV1KGEudmlkZW9UYWcpP2EuJGI/dGhpcy5tKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5tY3x8dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5rZigpLGEubWYoKSl9fSl9KShjKTt2YXIgc2E9Yy5yanx8c2E7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CmUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksCmQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5ycihnKXx8KHRoaXMuSihnKSxnPW5ldyBzYShnLHRoaXMuQSksZy5OKCksZy5iKCkpfWVsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSxJdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxjcTpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUueWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMudGp8fHRhLHVhPW5ldyB0YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuY3M9dGhpcy5hWzZdO3RoaXMuQmw9dGhpcy5hWzZdO3RoaXMuSGs9dGhpcy5hWzJdO3RoaXMuWGg9dGhpcy5hWzddO3RoaXMudnE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ubT1iO2IucHJvdG90eXBlPXticzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuR2soYSl9LEdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Iazp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGg6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgdmE9Yy5ubXx8dmEsT2M9bmV3IHZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PU9jLmJzKDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUChiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5TKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7CnZhciB3YT1jLnVtfHx3YTsoZnVuY3Rpb24oYyl7Yy50bT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB4YT1jLnRtfHx4YTsoZnVuY3Rpb24oYyl7Yy52bT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmCjA8ZS5FYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgd2EoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeGEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgeWE9Yy52bXx8eWEsemE9bmV3IHlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxpPXRoaXMuYVs0XTt0aGlzLnhoPXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLmh0PXRoaXMuYVs1XTt0aGlzLmp0PXRoaXMuYVs0XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLlpnPXRoaXMuYVsyXTsKdGhpcy5IcD10aGlzLmFbMl07dGhpcy54cD10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLmNyPWI7Yi5wcm90b3R5cGU9e2tpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5saTp0aGlzLndoKGEpfSx3aDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGg6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJzOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odDp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmp0OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5ZZyhhKX0sWWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpnOnRoaXMuR3AoYSl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IcDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuZzphfX19KShjKTt2YXIgQWE9Yy5jcnx8QWEsUGM9bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMua2koNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUChhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5TKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSwKcmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGtiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEJhPWMuZ218fEJhOyhmdW5jdGlvbihjKXtjLmZtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuaWE9dGhpcy5YYj10aGlzLldhPXRoaXMuc2M9ITE7dGhpcy5qZz1lLmxiKDEwKTt0aGlzLklnPSEwO3RoaXMud2Q9dGhpcy5HZj0hMTt0aGlzLiRmKCk7dGhpcy5GbygpO3RoaXMuSGEoKX0sV3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsdHlwZW9mIGIuYmEsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuYmE/Yi5iYS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuYmE/dHlwZW9mIGIuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS50YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYudGE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEudGE/Yi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS50YT90eXBlb2YgYi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYudGE/Yi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi50YT90eXBlb2YgYi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9kOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYub2Q6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYucGQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5wZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj8KdHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYudmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5qZyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sS2M6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LHVmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5YYn0scHI6ZnVuY3Rpb24oKXtpZighdGhpcy5GZil7dmFyIGI9CnRoaXMuZ2IoKSxhPXRoaXMubnIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLkZmPSEwKX1yZXR1cm4gdGhpcy5GZn0sbnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLnNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5zYz0hMCk7cmV0dXJuIHRoaXMuc2N9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LGhlOmZ1bmN0aW9uKCl7dGhpcy53ZD0hMDt2YXIgYj10aGlzLnVmKCk7aWYoYnx8dGhpcy5oYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTmI9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5OYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlgoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxIdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuJGUmJmIuYWRzJiYodGhpcy4kZT1iLmFkcyk7cmV0dXJuIHRoaXMuJGV9LEZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLldkKCl9LmJpbmQodGhpcykpfSxjZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWYoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNmKCl9LmJpbmQodGhpcyksNTApfSwkZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5wcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLktjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLktjKCksdGhpcy53ZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndkP3RoaXMubSgpOih0aGlzLlgoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5HZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuS2MoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlgoKSk6KHRoaXMuWCghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuR2Y9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxHbzpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuUWIhPWIuYWRzLnN0YXRlJiYodGhpcy5RYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5RYil7dGhpcy5tKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlFiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwO3RoaXMubSgiZW1wdHkgdmFzdCIpfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLklnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLklnLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKTG86ZnVuY3Rpb24oKXt0aGlzLlJ3fHwoMTA8dGhpcy5Fdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5KdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5Gdil7dGhpcy5Gdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQ2E9Yy5mbXx8Q2E7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLnZnKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy52ZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSx2ZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkVhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IEJhKGJbZ10pLGEuamF8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgQ2EoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYyl9fSl9KShjKTsKdmFyIERhPWMuaG18fERhLEVhPW5ldyBEYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VbD10aGlzLmFbNV07dGhpcy5Kaj10aGlzLmFbMTBdO3RoaXMuVmg9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuV249dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVszXTt0aGlzLnhpPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzFdfWMuWXM9YjtiLnByb3RvdHlwZT17SXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkpwOnRoaXMuVGwoYSl9LFRsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbDp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSmo6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZoOnRoaXMuc3MoYSl9LHNzOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudHM6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlduOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dbzp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueGk6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmlyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Zc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuUChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5TKGEpfSxlYTpmdW5jdGlvbigpe30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMueWx8fEdhOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdjPSExO3RoaXMua2coKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZ2M9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy53YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlhlKCk6dGhpcy5tKCl9LHdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5nYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZ2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy53Yy5iaW5kKHRoaXMpLAoxMDApfX0sWGU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhlLmJpbmQodGhpcyksNTApfX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5nYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhhPWMueGx8fEhhOyhmdW5jdGlvbihjKXtjLnpsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuemx8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs1XX1jLlZvPQpiO2IucHJvdG90eXBlPXtMbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1uOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgS2E9Yy5Wb3x8S2EsUmM9bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuTG4oNCk7KGZ1bmN0aW9uKGMpe2MuSWg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5aZj1hfSxOOmZ1bmN0aW9uKCl7fSxRZDpmdW5jdGlvbihiKXt0aGlzLlpmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpmKS5wYXJlbnROb2RlO3RoaXMuUChiKTt0aGlzLlMoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTGE9Yy5JaHx8TGE7KGZ1bmN0aW9uKGMpe2MuSGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxRZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIE1hPWMuSGh8fE1hOyhmdW5jdGlvbihjKXtjLkpoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IExhKGQsYSksdGhpcy5IKGQpfHwoZC5RZChhKSx0aGlzLkooZCksCmQ9bmV3IE1hKGQsdGhpcy5BLGcpLGQuUWQoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgTmE9Yy5KaHx8TmEsT2E9bmV3IE5hKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Yaj10aGlzLmFbMTBdO3RoaXMuR249dGhpcy5hWzhdO3RoaXMuWmg9dGhpcy5hWzhdO3RoaXMuT3A9dGhpcy5hWzldO3RoaXMuZGg9dGhpcy5hWzZdO3RoaXMueXQ9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy53cz1iO2IucHJvdG90eXBlPXtXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkduOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5aaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3A6CnRoaXMuYmgoYSl9LGJoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5kaDp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLndzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Xaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5QKGIpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0KIiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBRYT1jLmJrfHxRYTsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLm5jKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLApmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSkpOnRoaXMubmMoKX0sbmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFJhPWMuYWt8fFJhOyhmdW5jdGlvbihjKXtjLmNrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fAoodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuY2t8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy54dT10aGlzLmFbMTBdO3RoaXMuamg9dGhpcy5hWzJdO3RoaXMubHc9dGhpcy5hWzldO3RoaXMuemg9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVszXTt0aGlzLkZzPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs0XTt0aGlzLmR3PXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMudW89YjtiLnByb3RvdHlwZT17RG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHU6CnRoaXMuaWgoYSl9LGloOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qaDp0aGlzLmt3KGEpfSxrdzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHc6dGhpcy55aChhKX0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpoOnRoaXMucHcoYSl9LHB3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xdzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnM6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkttOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFVhPWMudW98fFVhLFRjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLkRvKDQpOwooZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlpkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUyhiKTp0aGlzLmRhKCl9LHN0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGIsZz10aGlzLmZiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlpiJiYoMDw9Zy5pbmRleE9mKGQpfHxhLllkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwKKHRoaXMuWmQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxrYjpmdW5jdGlvbigpe3RoaXMuWmQrKztpZigxMDx0aGlzLlpkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuQWt8fFZhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5pYisrLDE1PHRoaXMuaWIpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7CmVsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCl9fSwKd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLldhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLktwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5zdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuemt8fFdhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSChhKXx8KHRoaXMuSihhKSwobmV3IFdhKGEsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBYYT1jLkJrfHxYYSxZYT0KbmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmtwPXRoaXMuYVszXTt0aGlzLmxoPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMucW49YjtiLnByb3RvdHlwZT17S3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxzOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBaYT1jLnFufHxaYSxVYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy5Lcyg0KTsoZnVuY3Rpb24oYyl7Yy5iaj0KcC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlAoYi5lbGVtZW50KTt0aGlzLlMoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxYYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgJGE9Yy5ianx8JGE7KGZ1bmN0aW9uKGMpe2MuYWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBhYj1jLmFqfHxhYjsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgJGEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGFiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYmI9Yy5janx8YmIsY2I9bmV3IGJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJpPXRoaXMuYVsxMF07dGhpcy5Ccj10aGlzLmFbOF07dGhpcy5abz10aGlzLmFbN107CnRoaXMuU3A9dGhpcy5hWzJdO3RoaXMubGo9dGhpcy5hWzFdO3RoaXMubmg9dGhpcy5hWzVdO3RoaXMuSHM9dGhpcy5hWzRdO3RoaXMuSWk9dGhpcy5hWzEwXTt0aGlzLk1yPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzldfWMuSXE9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJpOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ccjp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm86dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNwOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JaToKdGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1yOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgZGI9Yy5JcXx8ZGIsVmM9bmV3IGRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuQWkoNCk7KGZ1bmN0aW9uKGMpe2Mubmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuc2YoYiwiZWxlbWVudElEIik7dGhpcy5nZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PQpiLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5QKGcpO3RoaXMuUyhnKTt0aGlzLkZjPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5GYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRmMpfSxYYTpmdW5jdGlvbigpe3JldHVybiEwfSxLbzpmdW5jdGlvbigpe2UuTGYodGhpcy5GYyk7ZS5NZih0aGlzLkZjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sTWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgZWI9Yy5uanx8ZWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGZiPWMubWp8fGZiOyhmdW5jdGlvbihjKXtjLm9qPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLmlucmVhZCl7dmFyIGI9ay5pbnJlYWQsYT1lLnNmKGIsImVsZW1lbnRJRCIpO2UuTGYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMub2p8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuUHE9dGhpcy5hWzRdO3RoaXMuUHI9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcz1iO2IucHJvdG90eXBlPXtpbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuamw6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBxOnRoaXMuT3IoYSl9LE9yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qcjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGliPWMucHN8fGliLFdjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLmlsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sYnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxnbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuSWE9YTt0aGlzLm9mPXRoaXMuVGc9ITE7dGhpcy5hZz1kO3RoaXMud2c9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuSWE9bmV3IHooYSkpO3ZhciBlPXRoaXMuUGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTsKaWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLktkKHRoaXMuSWEudXJsKSYmbS5nZCl7dmFyIGg9bmV3IHooYS51cmwpO2guYnUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5nYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uZ2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLmlqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5vZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMud2c/dGhpcy5QYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLlBhLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVGd8fCh0aGlzLlBhLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5QYS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsmJmsudnBhaWQmJm0mJm0uUmModGhpcy5JYS51cmwpJiZ0aGlzLlBhLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuUGEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuUGEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5LZCh0aGlzLklhLnVybCk/bS5nZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLktkKHRoaXMuSWEudXJsKSx0aGlzLmFnJiZ0aGlzLmFnKCl9cmV0dXJuIHRoaXMuUGF9fX0pKGMpO3ZhciBqYj1jLmlqfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnhkPXRoaXMuZWI9bnVsbDt0aGlzLmJwPXRoaXMucGI9dGhpcy5UZj0hMTt0aGlzLnZhPSIiO3RoaXMuT2Y9ITE7dGhpcy5CYT10aGlzLk5jPSIiO3RoaXMuS2Y9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuZWU9ITE7dGhpcy5PYT1bXTt0aGlzLkNmPXRoaXMuRmI9IiI7dGhpcy5CZD0hMTt0aGlzLnJlPTA7dGhpcy5GZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkRlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuamM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucWI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMuc2U9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5IZD0hMTt0aGlzLk1vPXRoaXMuaGQ9bnVsbDt0aGlzLmxlPXRoaXMuaGM9dGhpcy5KZz10aGlzLnVlPXRoaXMuZ2Q9dGhpcy55ZD10aGlzLmxjPSExO3RoaXMuUmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuamo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5PYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdyZWdleDp0aGlzLnhkLGpzcG9wdXBzOnRoaXMuVGYsc2lkZWxvYWRzOnRoaXMucGIsZGlzYWJsZXRlc3RzOnRoaXMuYnAsaG9tYWRBbGlhczp0aGlzLnZhLAppc0luaXRpYWxpemVkOnRoaXMuT2YsZ2xvYmFsQ29uZmlnOnRoaXMuTmMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLktmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuQ2YsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5CZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5yZSxIT01BRF9WRVJJRklFRDp0aGlzLkZlLEhPTUFEX0JMT0NLRUQ6dGhpcy5EZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5qYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRWUsdGVzdEhpZGU6dGhpcy5IYix0ZXN0VGFnczp0aGlzLnFiLHRlc3RUYWdzSlM6dGhpcy5JYix0ZXN0Q29va2llOnRoaXMuR2IsdGhyb3R0bGU6dGhpcy5zZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTW8sCmFkQmxvY2tlckRldGVjdGVkOnRoaXMubGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnlkLHVzZVN0cmljdENoZWNrczp0aGlzLmdkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUmEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMub2csZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaGMsc2tpcEFsbG93ZWQ6dGhpcy5sZX19LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlJhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUmFbYl0mJjE9PXRoaXMuUmFbYl0mJihhPSEwKTtyZXR1cm4gYX0saWU6ZnVuY3Rpb24oYSl7dGhpcy5SYVthXT0hMH0sZXE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuUmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5SYVtiXSYmMT09dGhpcy5SYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxvZTpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT0KdHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5tbyhhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLlJjKGEpO2U9dGhpcy5NYShhKTtjPyh0aGlzLmFjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsaz1lLnBhdGguc3Vic3RyKDEpKTooaD0KdGhpcy5nZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmVifHx0aGlzLnhkKSYmKGs9dGhpcy5vcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sUmM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmFjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGFjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLlJjKGEpO3JldHVybiBifSxncTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudmEmJjA8dGhpcy52YS5sZW5ndGgpcmV0dXJuIHRoaXMudmE7Zm9yKGQgaW4gdGhpcy52YSlpZihiPXRoaXMudmFbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuenc7cmV0dXJuIm5vbmUifSxQYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMub2ddfSxnZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGMoKSxiPXRoaXMuc2coKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb3M6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3JldHVybiBhfSxjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5PZj0hMDt0aGlzLk5jPWE7dGhpcy5CYT1iO3RoaXMuZWU9ZDt0aGlzLmhkPWM7dGhpcy5EYz1lO3RoaXMuRWI9Cmh8fHt9O3RoaXMuWHIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5WcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWmE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFhyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk5jK3RoaXMucWMoImdsb2JhbCIpKSx0aGlzLnRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LFZyOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnFjKCJjbGllbnQiKSk7dGhpcy5HYShuZXcgeih0aGlzLkJhK3RoaXMucWMoImNsaWVudCIpKSx0aGlzLnljLmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5pZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMubGIoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnlkKXt0aGlzLnlkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9O3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlo9dGhpcy5LZj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuRGUpKTt0aGlzLnRiKCk7ZS5UYihsLm10KTsoYj1lLnlmKHRoaXMuUGMoKSkpfHwoYj1lLnlmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx0cTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQmF8fHRoaXMuRmJ8fHRoaXMudmF8fHRoaXMueWMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy52YT1hLmFsaWFzfHxudWxsO3RoaXMuQ2Y9YS5hZHBhdGh8fCIiO3RoaXMuQmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5vZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnZhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfSxUYzpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTtpZihhKXt2YXIgYj0KbmV3IHoodGhpcy5nZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucWMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLkh1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJjdXN0b21lciIpO2E/dGhpcy5mbD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLmZsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5UYyghMCl9LmJpbmQodGhpcyksITApfX0sSHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLmdkPQp0aGlzLkpiKGIuc3RyaWN0KTt0aGlzLnVlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuSmc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnFiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMueGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVGY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5wYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaGM7dGhpcy5sZT1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkdiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mCkFycmF5P3RoaXMub3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLkJkJiYodGhpcy5HYj1udWxsKTt0aGlzLnNlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuSGQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkhkPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZHYoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMucWJ8fHRoaXMuR2IpP3RoaXMuZWU/KHRoaXMub2E9dGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSksdGhpcy56ZCgpLHRoaXMudGIoKSk6dGhpcy5TdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlR1KCkpfX0sU3U6ZnVuY3Rpb24oKXt0aGlzLlJ1KCl9LFR1OmZ1bmN0aW9uKCl7dGhpcy5aPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSk7dGhpcy50YigpfSxmZDpmdW5jdGlvbihhKXt0aGlzLmxjPQohMDt0aGlzLlp8fCh0aGlzLlo9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMudGIoKSx0aGlzLnpkKCkpfSxSdTpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemcoKX1lbHNlIHRoaXMuemcoKX0seWc6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoKSk7dGhpcy5XdShmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmZkKHRoaXMuamMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnFiPW51bGwsdGhpcy5wZSgpfSxXdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5HYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmxiKCkpO3RoaXMuWHUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnlnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnlnKCl9LFh1OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0scGU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLnJlKyssdGhpcy5HYShuZXcgeih0aGlzLkdiKSx0aGlzLlF1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFlKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMueGcoKX0scWU6ZnVuY3Rpb24oYSl7dGhpcy5mZCh0aGlzLkVlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sUXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucmU/dGhpcy5wZSgpOnRoaXMucWUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy54ZygpOnRoaXMucWUoIkFBQSIpfSx4ZzpmdW5jdGlvbigpe3RoaXMuWj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy51YikpO3RoaXMudGIoKTt0aGlzLnpkKCl9LHRiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMubGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLkZlKSk7dGhpcy5oZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhkJiZ0aGlzLmhkKCl9LEpvOmZ1bmN0aW9uKCl7aWYodGhpcy51ZSYmdGhpcy5FcSgpKXt2YXIgYT10aGlzLmVxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxDZzpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT0KYS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxHYTpmdW5jdGlvbihhLGIsYyxmLGgsSWMpe2E9bmV3IGpiKGEsYixjKTtmJiYoYS5UZz0hMCk7aCYmZS5zcigpJiYoYS5vZj0hMCk7SWMmJihhLndnPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFZlOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLkxhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmdhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuYWMoKXx8KGE9dGhpcy5NYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZ2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxJbzpmdW5jdGlvbigpe3RoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuR2EoYSx0aGlzLnh2LmJpbmQodGhpcyksdGhpcy53di5iaW5kKHRoaXMpKX0seHY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5EcCgpfSx3djpmdW5jdGlvbigpe30sRHA6ZnVuY3Rpb24oKXtlLlRiKGwuQ3ApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5wYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnBiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLkxhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUTt3aW5kb3dbYy5ZYigpXT10aGlzO2UuTGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuc2V9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LHNnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGtiPWMuamp8fGtiLG09bmV3IGtiO3dpbmRvdy5Fdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml3PXRoaXMuYVs4XTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLkVoPXRoaXMuYVs0XTt0aGlzLkZrPXRoaXMuYVs5XTt0aGlzLmJ3PXRoaXMuYVs1XTt0aGlzLk9sPXRoaXMuYVs4XTt0aGlzLnVuPXRoaXMuYVs2XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuQ2w9YjtiLnByb3RvdHlwZT17aHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLml3OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllpOnRoaXMuRGgoYSl9LERoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRms6dGhpcy5hdyhhKX0sYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ3OnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5PbDp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudW46dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgbGI9Yy5DbHx8bGIsWGM9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuaHcoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiLGMpe3RoaXMuaj1hO2EudS5MP3RoaXMuTmE9YS51LkwoKTp0aGlzLk5hPSIiO3RoaXMuY29udGFpbmVyPXRoaXMuai5TYTt0aGlzLnBsYXllcj10aGlzLmoudTt0aGlzLnRjPSExO3RoaXMua289MUUzO3RoaXMuY2E9bnVsbDt0aGlzLlQ9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5lZD17fTt0aGlzLnJjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMucmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5qLnUpJiZ0aGlzLmoudS5CJiYoYT10aGlzLmoudS5CKCkpLHRoaXMucmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5kZD0hMTt0aGlzLldmPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToKMTU7dGhpcy5zPXt9O3RoaXMucGM9ITE7dGhpcy5GZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuVG89ZS5wYSgxMCk7dGhpcy5XYz1lLnBhKDEwKTt0aGlzLlVkPWUucGEoMTApO3RoaXMudGc9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUmI9dGhpcy5CYj0hMTt0aGlzLkNkPW51bGw7dGhpcy5DYz10aGlzLnVnPXRoaXMuY2c9dGhpcy5HYz10aGlzLmZ2PXRoaXMuYWI9ITF9Yy5kaj1iO2IucHJvdG90eXBlPXtwZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxEZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5GYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmxjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLAoiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQobC5abSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpfSxPZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuVC5aKXRoaXMuVC5KbygpLHRoaXMuVC5vYSYmdGhpcy5ULmlzRW5hYmxlZD8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlQuaGN9KSk6Yj8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULmhjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5zYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5PZChhLGIsYyl9LDUwKX19LCRkOmZ1bmN0aW9uKGEpe3RoaXMuR2M9ITE7dGhpcy5zPWE7dGhpcy5qdSh0aGlzLnMpO3RoaXMuemYoYSl9LAp6ZjpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5lZD10aGlzLnFxKGEpKSx0aGlzLnpmKGEucGFyZW50KSl9LHFxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5ZKXtiPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksCmUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5VYShiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuRWMmJmEuRWMuZXJyb3ImJmEuRWMuZXJyb3IuY29kZSYmKGI9YS5FYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmljLmNvZGU6Yj09Qy5tZC5jb2RlP2UuRChsLk92LHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk6KGUuUGQoKSxiPT1DLkllLmNvZGUmJmUuRChsLnlzLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpO2UuRChsLkJwLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5HZS5jb2RlOmUuRChsLnl2LAp0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguSmUuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLkQobC5Wdix0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4Lm5kLmNvZGU6ZS5EKGwuJHYsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmxkLmNvZGU6ZS5EKGwuenMsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09CmMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLnpiKGEpO3RoaXMuc2EoKX0semI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5OZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuWHc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLm1uJiZ0aGlzLnBsYXllci5KYygpJiYoYi52b2x1bWU9CnRoaXMucGxheWVyLkpjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuaG4oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkJnKGIpPyh0aGlzLmtuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5PbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuSmQoKT90aGlzLnJnKCk6dGhpcy5zLm9yaWdpbi5oZih4LmxkKX0saHU6ZnVuY3Rpb24oKXtlLlplKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkFlJiZlLmxuKHRoaXMucy5vcmlnaW4uQWUpO2UuJGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmouQzt0aGlzLmouQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5qLkMsYSk7dGhpcy5qLmRnKCk7dGhpcy5qLmVjKCk7Zm9yKGE9dGhpcy5qLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuai5lYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmouRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuc3EoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5qLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnphKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLnVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5zYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmdGhpcy5KdigpLCJBZFN0YXJ0ZWQiPT0KYS5kYXRhLm5hbWUmJnRoaXMuS3YoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk52KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk12KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx2KCkpfS5iaW5kKHRoaXMpKTtlLnVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLnNhKCl9LmJpbmQodGhpcykpO2UudWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5zYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmouZW4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKS3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sSnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS4kYSgiaW1wcmVzc2lvbiIpfSxRZzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS4kYSgic3RhcnQiKX0sUGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS4kYSgiZmlyc3RRdWFydGlsZSIpfSxOdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLiRhKCJ0aGlyZFF1YXJ0aWxlIil9LE12OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLiRhKCJjb21wbGV0ZSIpfSxMdjpmdW5jdGlvbigpe2UuJGEoImFkc3RvcHBlZCIpO3RoaXMuc2EoKX0saG46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5UO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5hYygpPyhmPWUuTWEoZiksYj1mLnByb3RvY29sKwoiOi8vIitmLmhvc3QpOmI9ZjtjLnNyYz1iLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuQXYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxCZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LGtuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLk9nLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sJGM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuT2cuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sT2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlby5jb250cm9scz0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksdGhpcy5rbyl9LHhlOmZ1bmN0aW9uKGEpe3RyeXtpZighZS5ZYSgpJiZ0aGlzLlQuSmcmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLnMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuVC5nYSgidmlkZW8tbm9vcCIpKTsKcmV0dXJufX1jYXRjaChiKXt9dGhpcy50Y3x8IXRoaXMuQmcodGhpcy52aWRlbyl8fHRoaXMuQmJ8fCh0aGlzLnRjPSEwLHRoaXMuenYoKSx0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHRoaXMuai5lYygpLHRoaXMuTGcoKSx0aGlzLk1nKCksdGhpcy5UZSgpLHRoaXMuai5kZygpLHRoaXMudmlkZW8ucGxheSYmdGhpcy5uZSgpKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy5DYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLk9jPVtdO2Zvcih2YXIgYj10aGlzLmouRyxjPTA7YzxiLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5PYy5wdXNoKGIuY2hpbGRyZW5bY10pLGIuY2hpbGRyZW5bY10uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLnJkKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5yZCgpfWVsc2UgdGhpcy5yZCgpfSxyZDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspdGhpcy5PY1thXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGE9dGhpcy52aWRlby5wbGF5KCkpJiZhWyJjYXRjaCJdKWFbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5zYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwiIiwhMCkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5lKCkpfS5iaW5kKHRoaXMpOwp0aGlzLnhmKCkucWcodGhpcyl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLkQobC5VbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMucy54Yj8odGhpcy50Yz0hMSx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZGQ9ITEsdGhpcy5qLkhnKCksdGhpcy5zLm9yaWdpbi5WZCgpKTp0aGlzLnNhKCl9LEF2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuJGModGhpcy52aWRlbyksdGhpcy5KZCgpPwp0aGlzLnJnKCk6dGhpcy5qZChhKSl9LGpkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuVmUoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZSgpKTt0aGlzLnMub3JpZ2luLmhmKHgubGQpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnYpdGhpcy5zYSgpO2Vsc2V7dGhpcy5aYj0hMDt0aGlzLmoudS5rYiYmIXRoaXMudWcmJnRoaXMuai51LmtiKCkmJmUuRChsLkFjLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLmt2KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5tZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50Zyk7YyYmKGI9dGhpcy5zLm1lLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5kZHx8KHRoaXMuZGQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGwuJG0sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTt0aGlzLnMueGI/KHRoaXMudGM9ITEsdGhpcy4kYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmRkPSExLHRoaXMuai5IZygpLHRoaXMucy5vcmlnaW4uVmQoKSk6dGhpcy5zYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5yYy5yZXBsYWNlKCJbdGltZV0iLGUucGYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMucGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHJnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5scSgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5lYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuTmcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuTGcoKTt0aGlzLk1nKCk7dGhpcy5DZD1zZXRJbnRlcnZhbCh0aGlzLkhvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sbHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZj1iPXRoaXMucy5NW2NdLGU7ZT1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLmFjKCkmJihlPWguTWEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKSG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLkNkKSx0aGlzLndlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMueWUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuQ2QpLHRoaXMuamQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmNnPSEwLHRoaXMuR2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxrdjpmdW5jdGlvbihhKXthPT10aGlzLkZnfHx0aGlzLkJifHwoMD09YSYmKHRoaXMuYWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYWIpLHRoaXMuYWI9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLkVnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5FZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5CYnx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUuRChsLldtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSksZS5EKGwuYW4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSx0aGlzLlJiJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5HYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChsLlZtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLkQobC5ZbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5EKGwuY24sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSksZS5EKGwuZG4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSwKdGhpcy5GZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5CYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnJxKHRoaXMucy5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmVkLmltcHJlc3Npb25zJiZlLnFyKGYudXJsLHRoaXMuZWQuaW1wcmVzc2lvbnMpP3RoaXMuTmQoZi51cmwsZi50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UuRChsLlhtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSx7YWRJZDp0aGlzLmVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5OZChmLnVybCxmLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy5BYT10aGlzLiRvKHRoaXMucy5BYSxhKSl9fSxOZDpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuS2EoYSksYyYmYS5nbihjKSxmfHwoZj10aGlzLmdmKSx0aGlzLlQuR2EoYSxmLHRoaXMuZ2YsITEsITApKX0scnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSwkbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx6djpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5OZy5iaW5kKHRoaXMpfSxOZzpmdW5jdGlvbigpe2UuRChsLk5vLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkdjJiZlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZS5acCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMueGN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnhjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucmMucmVwbGFjZSgiW3RpbWVdIixlLnBmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LE1nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Ubzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmJkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuV2M7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaHYuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlVkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ3YuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5WYi5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMudGc7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5tZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLmJkLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LlhhJiZ0aGlzLmoudS5YYSgpJiZ0aGlzLnVzKCk7dGhpcy5WYigpfX0sVmI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxiZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxodjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuV2MpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQobC5PZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sWWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLldjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuT2UsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5XYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sZ3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlVkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LHVzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LENiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYik7dGhpcy5DY3x8dGhpcy5wY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmUoKSl9LHNhOmZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkZhJiZ0aGlzLnBjfHwicG9zdHJvbGwiPT1lLkZhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5lYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5BZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLkFkKCl9ZWxzZSB0aGlzLkFkKCl9LEFkOmZ1bmN0aW9uKCl7dGhpcy51Zz0hMDt0aGlzLmouQmYoKTsKdGhpcy5qLk50KCk7dGhpcy5aYj0hMTtlLkQobC5Tbyx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMueGYoKS5LdCgpfSx4ZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxKZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51YSgibWluVmlzIik7YSYmKGUuTWYodGhpcy52aWRlbyxhKT90aGlzLk10KCk6dGhpcy5ZZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy54YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy54Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LGdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmRqfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs5XTt0aGlzLlN0PXRoaXMuYVsxMF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5QbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVszXX1jLlJzPWI7Yi5wcm90b3R5cGU9e1JrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tazp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlN0OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUG06dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5Sc3x8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuUmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5ZPW51bGw7dGhpcy5NYj0hMTt0aGlzLkFlPSIiO3RoaXMuemU9ITE7ZCYmZC5lbXB0eT90aGlzLiRyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmVtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ub2UodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuYWYodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5vZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5vZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KImNvbWFwcHNwb3RpbWEzdnBhaWQiKSxiLmRhdGEuaG9tYWRfY29tcGF0aWJsZV92cGFpZD0idHJ1ZSIpO20uR2EoYix0aGlzLlpyLmJpbmQodGhpcyksdGhpcy5Xci5iaW5kKHRoaXMpKX0scWY6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsKIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysKKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe31lbHNlIGMuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxacjpmdW5jdGlvbihhKXt0aGlzLkR0KGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4Lm5kKSl9dGhpcy5iYT0KdGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LCRyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkphfHwodGhpcy5KYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQ2EoeC5uZCkpfXRoaXMuYmE9dGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LFdyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguR2Use2RlcHRoOmF9KSl9LFVjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLnZyKCk/dGhpcy5ZdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFmKCksZyx7QWRTeXN0ZW06dGhpcy5YcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5mYSh0aGlzLkNhKHguSmUpKTooYT0wLHRoaXMudXYoKSYmdGhpcy4kZCh0aGlzLlVvKCkpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLk1iPyh0aGlzLk1iPTE8dGhpcy5iYS5sZW5ndGgsdGhpcy5iYS5sZW5ndGgmJnRoaXMuVWMoKSk6dGhpcy5wYXJlbnQuVmQoKX0sdXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WdSgpP3RoaXMuVXUoKT8hMDooLTEhPXRoaXMuVWIoKT90aGlzLmZhKHRoaXMuQ2EoeC5DZSkpOnRoaXMuZmEodGhpcy5DYSh4LmJpKSksITEpOih0aGlzLmZhKHRoaXMuQ2EoeC5pYyxDLkllKSksITEpfSwkZDpmdW5jdGlvbihhKXthLkFhPWEuQWEuY29uY2F0KHRoaXMuUmQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC4kZChhKX0sVW86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMudmYoKTthLnhjPXRoaXMuJHAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLldwKCk7YS5tZT10aGlzLnBxKGEuZHVyYXRpb24pOwpyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oYil7dGhpcy5ZJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguQ2UuY29kZT9iLkFhLmNvbmNhdCh0aGlzLmJxKCkpOmIuQWEuY29uY2F0KHRoaXMuanEoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuemImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC56YiYmdGhpcy5wYXJlbnQuemIoYiksYT0wLHRoaXMuVWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0saGY6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxWdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMudmYoKS5sZW5ndGh9LApVdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sRHQ6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLkFlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy56ZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2cjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQWYoKS5sZW5ndGh9LEFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FZCh0aGlzLlksIkFkU3lzdGVtIil9LFJkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxnLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuVWEoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxqcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxicTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCnZmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksdWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEN3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlVhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnVjKS1NYXRoLmFicyg3MDAtYi51Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS51YyktTWF0aC5hYnMoNzAwLWIudWMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZz1bXSxiPSExLGQ9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTWMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVWEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGV8fG0mJm0ubGUpdHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkF1KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToKIiJ9LE1jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlprPXRoaXMuYVs0XTt0aGlzLmd3PXRoaXMuYVs2XTt0aGlzLkRyPXRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbNV07dGhpcy5DdT10aGlzLmFbNl07dGhpcy5Taj10aGlzLmFbN107dGhpcy5xcD10aGlzLmFbNV07dGhpcy5Rcz10aGlzLmFbMTBdO3RoaXMuZz10aGlzLmFbMl19Yy5udj1iO2IucHJvdG90eXBlPXtZazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWms6dGhpcy5mdyhhKX0sZnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmd3OnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkRyOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NbDp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3U6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Tajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMubnZ8fHBiLFpjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLllrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMueGM9IiI7dGhpcy5PPQp0aGlzLnhiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Laz1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxzcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG5iPWMuS2t8fG5iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Wcz10aGlzLmFbOV07dGhpcy56cj10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzhdO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuams9YjtiLnByb3RvdHlwZT17aXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmp2OnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wczp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenI6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuQ20oYSl9LApDbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG06dGhpcy5JdShhKX0sSXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkp1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5qa3x8cWIsJGM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9JGMuaXYoNCk7dmFyIHg9e25kOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLGthOiJYTUxfUEFSU0VfRVJST1IifSxiaTp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsa2E6IkRVUkFUSU9OX0VSUk9SIn0saWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLAprYToiRU1QVFlfVkFTVCJ9LEplOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLGthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxHZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKa2E6IkxPQURfRVJST1IifSxsZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsa2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxydzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixrYToiTUVESUFGSUxFX0VSUk9SIn0sQ2U6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsa2E6IkRVTU1ZX0FEIn19LEM9e0hlOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsa2E6Ik5PX0FEUyJ9LEllOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixrYToiTk9fTUVESUFGSUxFUyJ9LHR3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixrYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG1kOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLGthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm51PXRoaXMuYVsxXTt0aGlzLlhzPXRoaXMuYVs0XTt0aGlzLmhsPXRoaXMuYVsxXTt0aGlzLk9qPXRoaXMuYVsxXTt0aGlzLnRvPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMuQ2g9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm51OnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaGw6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Pajp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcmI9Yy5DaHx8cmIsYWQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQubXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5FYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgb2I9Yy5MaXx8b2I7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU3I9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLkVpPQp0aGlzLmFbNF07dGhpcy5kbD10aGlzLmFbNF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5haD10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkxtPWI7Yi5wcm90b3R5cGU9e1JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNrOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5tcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWk6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbjp0aGlzLlZ0KGEpfSxWdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV3Q6dGhpcy4kZyhhKX0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTG18fHNiLGJkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuU2E9YS5yZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuVGE9e307dGhpcy5RZj0hMTt0aGlzLldiPVtdfWMuamk9YjtiLnByb3RvdHlwZT17bnE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMubnEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLm9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxHdTpmdW5jdGlvbigpe3RoaXMuUWY9ITB9LEhnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxkZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2UuRChsLkFjLHRoaXMudS5CKCkpfSxOdDpmdW5jdGlvbigpe3RoaXMuUWZ8fCh0aGlzLnUucGxheSgpLGUuRChsLkJjLHRoaXMudS5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlNhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5TYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlNhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuU2Eub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5TYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5TYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUucmYoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5EZi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sb3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGFxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sRGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hcSh0aGlzLlNhKTsKaWYoYi54IT10aGlzLlRhLnh8fGIueSE9dGhpcy5UYS55fHxiLnBvc2l0aW9uIT10aGlzLlRhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlRhLndpZHRofHxiLmhlaWdodCE9dGhpcy5UYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5UYS53aWR0aCYmMDx0aGlzLlRhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmYoKTtyZXR1cm59dGhpcy5UYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuV2IubGVuZ3RoO2ErKyl0aGlzLldiW2FdKHt3aWR0aDpiLndpZHRoLApoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLkRmLmJpbmQodGhpcyksMTApfSxlbjpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy5XYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuV2IucHVzaChhKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTj1jLmppfHxOLEI9W10sdGI9MDsxMDA+dGI7dGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRxPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVs5XTt0aGlzLnpxPXRoaXMuYVs2XTt0aGlzLkVuPXRoaXMuYVsxXTt0aGlzLlVyPXRoaXMuYVs5XTt0aGlzLnduPXRoaXMuYVsxXTt0aGlzLmJ0PXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLmlwPXRoaXMuYVs3XTt0aGlzLmdpPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuT3M9YjtiLnByb3RvdHlwZT17WnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRxOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLnlxKGEpfSx5cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenE6dGhpcy5EbihhKX0sCkRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVXI6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnduOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idDp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHY6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmlwOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5naTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMuT3N8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLlpxKDQpOyhmdW5jdGlvbihjKXtjLnVrPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMua2UoYik7dGhpcy5lZigpfSxrZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKa2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy51a3x8dmI7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7CnRoaXMud2I9dGhpcy53Ynx8ITE7dGhpcy5OZT10aGlzLlFlPXRoaXMuSGY9dGhpcy5pYT10aGlzLnRlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTHAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRlPSEwO3RoaXMuSGYmJnRoaXMuWWUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudmMoKTsKdGhpcy5IZj0hMDt0aGlzLlllKCl9LmJpbmQodGhpcykpO3RoaXMuVWUoKX0sWWU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy52YygpO2lmKCF0aGlzLnRlJiYhdGhpcy52YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudGUmJnRoaXMuTmUmJiF0aGlzLlFlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHdmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApVZTpmdW5jdGlvbigpe2lmKHRoaXMudmMoKSl7dmFyIGI9dGhpcy53ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlFlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuTmU9Yi55d310aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZSgpfS5iaW5kKHRoaXMpLDEwMCl9LEZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlN3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxrcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxMcDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpjKCl9LmJpbmQodGhpcyksMTAwKX0semM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5RYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmtxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCnRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk9rLkltLkdtP3dpbmRvdy5PTy5Pay5JbS5HbS53dyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cigpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMudmt8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQW89dGhpcy5hWzhdO3RoaXMua3I9dGhpcy5hWzhdO3RoaXMuTHU9dGhpcy5hWzNdO3RoaXMuUWs9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy52cz1iO2IucHJvdG90eXBlPXt6bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW86dGhpcy5qcihhKX0sanI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtyOnRoaXMuS3UoYSl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB6Yj1jLnZzfHx6YixkZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1kZC56byg0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMudmx8fFU7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkudGQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuSXMoYSl9LmJpbmQodGhpcykpO3kuRHEoKX0sSXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLnVsfHxWOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLlZjJiYoYj1lLmFwKGIsdGhpcy5WYykpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLAoiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGJbYV0pLGQ9bmV3IFUoaCksdGhpcy5IKGQpfHwodGhpcy5KKGQpLGY9bmV3IFYoZCx0aGlzLkEpLGYuYigpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sdGQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2JdfHwodGhpcy5hYVtiXT17fSk7dGhpcy5hYVtiXVthXXx8KHRoaXMuYWFbYl1bYV09W10pO3RoaXMuYWFbYl1bYV0ucHVzaChjKX0sWnU6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5hYXx8CnRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuYmN8fCh0aGlzLmJjPVtdKSx0aGlzLmJjLnB1c2goYiksdGhpcy5MdCgpJiYodGhpcy5sZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYwPHRoaXMuYWFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYV1bY11bZF0oYil9fSxEcTpmdW5jdGlvbigpe2lmKHRoaXMuYmMpZm9yKHZhciBiPTA7Yjx0aGlzLmJjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuYmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuYWFbY11bZF1bZl0oYSl9fSwKdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5adShiKX19KX0pKGMpO3ZhciBBYj1jLndsfHxBYix5PW5ldyBBYihxKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLmptPXRoaXMuYVsyXTt0aGlzLnFsPXRoaXMuYVs1XTt0aGlzLmxzPXRoaXMuYVszXTt0aGlzLmVvPXRoaXMuYVs0XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLktsPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJGk6CnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Rajp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFsOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sczp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW86dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51aTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLktsfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5GbCg0KTsoZnVuY3Rpb24oYyl7Yy5NaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPQohMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxrYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLk1ofHxDYjsoZnVuY3Rpb24oYyl7Yy5OaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucXR8fCh0aGlzLnF0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5OaHx8RGI7KGZ1bmN0aW9uKGMpe2MuT2g9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLAp0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy55YSlpZihhPT10aGlzLnlhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5PaHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs2XTt0aGlzLmFpPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzhdfWMubWs9YjtiLnByb3RvdHlwZT17dWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZoOnRoaXMuJGgoYSl9LCRoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5haTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdiPWMubWt8fApHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5sbT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEhiPWMubG18fEhiOyhmdW5jdGlvbihjKXtjLmttPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuU2V8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLlZwfHwodGhpcy5JZigpLAp0aGlzLlZwPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLlNlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5TZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxZcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sSWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLllwKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5pYT0hMCx0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLm8oKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZigpfS5iaW5kKHRoaXMpLDUwKX0sUXc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSGIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBJYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEpiPWMubW18fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SaD10aGlzLmFbMV07dGhpcy5ydT10aGlzLmFbNF07dGhpcy5oaD10aGlzLmFbOF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5waD10aGlzLmFbNF07dGhpcy5xaz10aGlzLmFbOV07dGhpcy56dT10aGlzLmFbOF07dGhpcy55bj10aGlzLmFbNl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5lcj10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e1FoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUmg6dGhpcy5xdShhKX0scXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ1OnRoaXMuZ2goYSl9LGdoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5oaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU246dGhpcy5vaChhKX0sCm9oOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5waDp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucWs6dGhpcy55dShhKX0seXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnp1OnRoaXMueG4oYSl9LHhuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bjp0aGlzLm53KGEpfSxudzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub3c6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgTGI9Yy5Obnx8TGIsZ2Q9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuUWgoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXIoInBsYXllclBsYXlFbmQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5bGlzdFBsYXlOZXh0IixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuRGp8fE1iOyhmdW5jdGlvbihjKXtjLkNqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IixmdW5jdGlvbigpe3RoaXMubmYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm5mKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLmJuKCl9LmJpbmQodGhpcykpLHRoaXMuU2c9ITEsdGhpcy5Sdj0xRTMsdGhpcy5mZz17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG5mOmZ1bmN0aW9uKCl7dGhpcy5mZy5kb25lfHwodGhpcy5mZy5kb25lPSEwLHRoaXMuU2c9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksdGhpcy5SdikpfSxibjpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5TZyk7dGhpcy5tKCl9LFJnOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksdGhpcy53KCkpfSx0ZjpmdW5jdGlvbihiKXt2YXIgYT1bXTtpZihiKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJmJbY11bZF0mJmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZj1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7CmEucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLnRmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMudGYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwO3JldHVybiExfX0pfSkoYyk7dmFyIE5iPWMuQ2p8fE5iOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj0KbnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjJiYoYz1uZXcgTWIoYyksdGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgTmIoYyx0aGlzLkEpKS5iKCkpKX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2I9Yy5Fanx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNzPXRoaXMuYVs1XTsKdGhpcy54aj10aGlzLmFbMl07dGhpcy5tdj10aGlzLmFbMl07dGhpcy56aj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5CaD10aGlzLmFbMV07dGhpcy5ybz10aGlzLmFbOF07dGhpcy5RaT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLlFuPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dczp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueGo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm12OnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuemo6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktuOnRoaXMuQWgoYSl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CaDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm86dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5RaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIFFiPWMuUW58fFFiLGhkPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLkJzKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgUmI9Yy5zbHx8UmI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5MZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGQoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLAoiSU1BIiksdGhpcy5vKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTApfSxMZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5ybHx8U2I7KGZ1bmN0aW9uKGMpe2MudGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgUmIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFNiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBUYj1jLnRsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzhdO3RoaXMuQm09dGhpcy5hWzddO3RoaXMucWo9dGhpcy5hWzEwXTt0aGlzLmR0PXRoaXMuYVsxXTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVs4XTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLk51PQp0aGlzLmFbMl07dGhpcy5nPXRoaXMuYVs3XX1jLkpzPWI7Yi5wcm90b3R5cGU9e0J2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLkFtKGEpfSxBbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJtOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xajp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHQ6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RcDp0aGlzLm92KGEpfSxvdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnB2OnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5GbTp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHA6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk51OnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFZiPWMuSnN8fFZiLGlkPW5ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkJ2KDQpOyhmdW5jdGlvbihjKXtjLmFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5QKGIpO3RoaXMuUyhiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmFlPSExfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy50dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpOwpiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LER1OmZ1bmN0aW9uKCl7dGhpcy5hZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFdiPWMuYWx8fFdiOyhmdW5jdGlvbihjKXtjLiRrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5LYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5qcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuS2J8fCh0aGlzLktiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLktifHx0aGlzLktiKyssdGhpcy5LYjw9dGhpcy5qcz8odGhpcy5LYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKX0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRHUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFhiPWMuJGt8fFhiOyhmdW5jdGlvbihjKXtjLmJsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBXYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBYYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFliPWMuYmx8fFliLFpiPW5ldyBZYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5waT10aGlzLmFbOV07dGhpcy5wdT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkRzPWI7Yi5wcm90b3R5cGU9e29pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5waTp0aGlzLm91KGEpfSxvdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucHU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOgphfX19KShjKTt2YXIgJGI9Yy5Ec3x8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQub2koNCk7KGZ1bmN0aW9uKGMpe2MuV2s9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy5Xa3x8YWM7KGZ1bmN0aW9uKGMpe2MuVms9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRGEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMub2IoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5QbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkxjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5OcigpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxQbzpmdW5jdGlvbigpe3RoaXMuTWUoKXx8dGhpcy5vKCEwKX0sTnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7IWIubWEmJgpiLmJhJiZiLnZ3JiZiLnh3JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmcpZm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkRhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PQphJiYodGhpcy5iZz1iW2NdKTtyZXR1cm4gdGhpcy5iZ30sTGQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuTGMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKTp0aGlzLncoKTp0aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmM9Yy5Wa3x8YmM7KGZ1bmN0aW9uKGMpe2MuWGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5wbGF5ZXJhcGkpe3ZhciBiPWsucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgYWMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBjYz1jLlhrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzJdO3RoaXMucnY9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy5vbD1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZwOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HaTp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3I6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm5sOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucnY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLm9sfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5FcCg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApwYXVzZTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJgoodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9Yy5aanx8VzsoZnVuY3Rpb24oYyl7Yy5Zaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5iZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLmJlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuYmUmJmIhPXRoaXMuYmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5VdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWD1jLllqfHxYOyhmdW5jdGlvbihjKXtjLiRqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBXKGIpLGIuamE/dGhpcy5sZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBYKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCxmYz1jLiRqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5wYi5sZW5ndGgpe3ZhciBhPW0ucGIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuVmYuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlZmKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudHY9dGhpcy5hWzJdO3RoaXMuZXM9dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzZdO3RoaXMuUHU9dGhpcy5hWzJdO3RoaXMuQXA9dGhpcy5hWzZdO3RoaXMuc2k9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbN119Yy55cD1iO2IucHJvdG90eXBlPXtzdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVzOnRoaXMuYnYoYSl9LGJ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5jdjp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlB1OnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcDp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc2k6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLnlwfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5zdig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUChhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYz8odGhpcy5TKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy54cz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sWHQ6ZnVuY3Rpb24oYil7dGhpcy5xZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54c30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLnFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5xZCYmKG5ldyBHKHRoaXMsdGhpcy5xZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLklsfHxNOyhmdW5jdGlvbihjKXtjLkhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5EZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJgp3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLmd1KCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwKMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLGEpKTpiLmwoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEc9Yy5IbHx8RzsoZnVuY3Rpb24oYyl7Yy5KbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy54YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkgoYil8fAoodGhpcy5KKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYi5YdCh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgaWM9Yy5KbHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaD10aGlzLmFbOV07dGhpcy4kbD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5ncz10aGlzLmFbMl07dGhpcy5maD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLm5vPWI7Yi5wcm90b3R5cGU9e0toOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaDp0aGlzLlpsKGEpfSxabDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56aTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdzOnRoaXMuZWgoYSl9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5maDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPQpjLm5vfHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5LaCg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5iZj0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5TKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iZn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksCjQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuYmY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3lvOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5Vanx8bGM7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWXc6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQmUobmV3IGZ1bmN0aW9uKCl7fSk7CmEuc3c9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuRnQoYSk7d2luZG93LkF3PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0fHwodGhpcy5FdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLklkfHwodGhpcy5JZD0xKTtpZigyMDx0aGlzLklkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTsKcmV0dXJufXRoaXMuSWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTsKd2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT0KdHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0saGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMuVGp8fG1jOyhmdW5jdGlvbihjKXtjLlZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgbmM9Yy5Wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5zPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzhdfWMubnQ9YjtiLnByb3RvdHlwZT17TXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5zOnRoaXMud3EoYSl9LHdxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLm50fHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Ncyg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpO2EmJnRoaXMuUChhLnBhcmVudE5vZGUpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpOwp2YXIgWT1jLkxqfHxZOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkVmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5XYT10aGlzLnNjPSExO3RoaXMuamc9ZS5sYigxMCk7dGhpcy5OZigpfSxOZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuSGEoKSwhMDt0aGlzLkVmKys7aWYoMTA8dGhpcy5FZil0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5vKCEwKToKdGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLAoyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5Lanx8WjsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYKKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5xPXRoaXMuYVsyXTt0aGlzLktxPXRoaXMuYVs0XTt0aGlzLnNuPXRoaXMuYVsxXTt0aGlzLlVrPXRoaXMuYVsxXTt0aGlzLlB0PXRoaXMuYVs4XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNF07dGhpcy5hdj10aGlzLmFbMTBdO3RoaXMuem09dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNl19Yy5Hcj1iO2IucHJvdG90eXBlPXtNcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk5xOnRoaXMuSnEoYSl9LEpxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LcTp0aGlzLnJuKGEpfSxybjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLnNuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWs6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnZvKGEpfSx2bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud286dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmF2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56bTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMuR3J8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLk1xKDQpOyhmdW5jdGlvbihjKXtjLk5pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5QKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5OaXx8dGM7KGZ1bmN0aW9uKGMpe2MuTWk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksCnRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5NaXx8dWM7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRWEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7CmVsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgdmM9Yy5PaXx8dmMsd2M9bmV3IHZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVszXTt0aGlzLkN0PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVs0XTt0aGlzLlZxPXRoaXMuYVszXTt0aGlzLlp2PXRoaXMuYVs1XTt0aGlzLmJtPXRoaXMuYVsyXTt0aGlzLlhvPXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuSGo9YjtiLnByb3RvdHlwZT17U3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DdDp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSms6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMuWXYoYSl9LApZdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWnY6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ibTp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhvOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ZcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHhjPWMuSGp8fHhjLHBkPW5ldyB4YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXBkLlNxKDQpOyhmdW5jdGlvbihjKXtjLlVpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuUChiKSx0aGlzLlMoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciB5Yz1jLlVpfHx5YzsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5XZSgpfSxXZTpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2UoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIHpjPWMuVGl8fHpjOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIuamEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5IKGIpKXt0aGlzLkooYik7KG5ldyB6YyhiLHRoaXMuQSkpLmIoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIEFjPWMuVml8fEFjLEJjPW5ldyBBYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbOV07dGhpcy5Dbj10aGlzLmFbNl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs5XX1jLkdoPWI7Yi5wcm90b3R5cGU9CntYbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW46dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlV0OnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLkJuKGEpfSxCbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ246dGhpcy5pbyhhKX0saW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5HaHx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuWG4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUGY9dGhpcy5TZj10aGlzLlJmPSExO3RoaXMuWGM9W107dGhpcy5mZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT0KdHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRhP251bGw6VGEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBZYT9udWxsOllhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLApiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgY2I/bnVsbDpjYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaGI/bnVsbDpoYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE9hP251bGw6T2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHBhP251bGw6cGF9fWMuTWs9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5tcShhKTpbXSxiO3RoaXMuU2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuUmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMubWcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmZlKXtpZih0aGlzLlBmKWJyZWFrO2I9dGhpcy5mZVtjXTt0aGlzLnZlKGIpJiYodGhpcy5YYy5wdXNoKGIpLHRoaXMubWcoYikpfX0sdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxtcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5mZVtjXSx0aGlzLnZlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEpe3RoaXMudmUoYSkmJmEuYigpfSxGdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YKcCYmIXRoaXMuUmYpZm9yKHRoaXMuUGY9ITAsYT0wO2E8dGhpcy5YYy5sZW5ndGg7YSsrKXRoaXMuWGNbYV0uc2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5YY1thXS5zYil9fX0pKGMpO3ZhciBEYz1jLk1rfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YZz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLldpPWI7Yi5wcm90b3R5cGU9e1dnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLldpfHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5XZyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuVGIobC52diksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuVGIobC5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTsKdmFyIHNkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZWE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IFEsaz0hMTtGLlliKCk7Ri5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuWWIoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkpmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5ZYigpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxGLmxyKCkse2lkOnRkfSl9LDUwMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dT10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbMTBdO3RoaXMuVW49dGhpcy5hWzVdOwp0aGlzLnlrPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzddfWMuSHE9YjtiLnByb3RvdHlwZT17c3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnR1OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TaTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQmo6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlVuOnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLkhxfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC5zdSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuaGc9dGhpcy5jb25mPXRoaXMuVmE9CnRoaXMucGxheWVyPW51bGw7dGhpcy5TYz0wO3RoaXMuTmE9IiI7dGhpcy5ZYz1bXTt0aGlzLlpjPTA7dGhpcy5pZz0hMTt0aGlzLmNlPVtdfWMuVWc9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5oZz1hfSxhZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuTmE9dGhpcy5wbGF5ZXIuTCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFp0OmZ1bmN0aW9uKGEpe3RoaXMuVmE9YX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuTGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLlZhKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMubXIoKSl0aGlzLlZhLmModGhpcy5WYS5OYyx0aGlzLlZhLkJhLHRoaXMuVmEuZWUsZnVuY3Rpb24oKXt0aGlzLmRjKGEsYil9LmJpbmQodGhpcyksdGhpcy5WYS5EYyk7ZWxzZSBpZih0aGlzLkZxKCkpdGhpcy5RdChmdW5jdGlvbigpe3RoaXMuZGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChsLkFjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkd1KCk7ay5leGl0RnVsbHNjcmVlbigpO1I9az1uZXcgTyhrLAp0aGlzLlZhLGgpO2sucGcodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX1hPXRoaXMuaHMoYSk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk1kJiYoYz10aGlzLnBsYXllci5NZCgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5PZChhLGMsZik7dGhpcy5wbGF5ZXIucWcoayl9fSxtcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlNjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuU2MuZ2V0VGltZSgpLHRoaXMuU2M9YSwzRTU8Yj8hMDohMTt0aGlzLlNjPWE7cmV0dXJuITF9LHZ1OmZ1bmN0aW9uKCl7ZS5qZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudWEoImFkVGFnIik7dGhpcy51YSgicHJlcm9sbEFkVGFnIikmJgooYT10aGlzLnVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5qZihhKSk/dGhpcy5kYyhhKTooc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX0sdXU6ZnVuY3Rpb24oYSl7ZS5qZSgicG9zdHJvbGwiKTtpZighdGhpcy5oZyl7dGhpcy5kdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZihjKSk/dGhpcy5kYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKSl9fSxqZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9CmEoYil9cmV0dXJuIGF9LEh0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaXUodGhpcy51dS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5lYSgpfSxjZDpmdW5jdGlvbihhKXtlLmplKCJtaWRyb2xsIik7aWYoIXRoaXMuWGYpe3RoaXMuWGY9ITA7dmFyIGI9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy51YSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuZGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGY9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX19LEd0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5TZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy52dSgpO3RoaXMucGxheWVyLlNkJiZ0aGlzLkd0KCk7dGhpcy5IdCgpfSxJdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5ZYy5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLlpjPXRoaXMuWWMubGVuZ3RofSxGcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5aYyYmKGE9ITApO3JldHVybiBhfSxRdDpmdW5jdGlvbihhKXt0aGlzLmlnPWE7Zm9yKGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdWyJmdW5jdGlvbiJdKHRoaXMud3QuYmluZCh0aGlzKSl9LHd0OmZ1bmN0aW9uKGEpe3RoaXMuWmMtLTthJiZ0aGlzLmNlLnB1c2goYSk7MD49dGhpcy5aYyYmdGhpcy5pZygpfSxoczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5jZS5sZW5ndGg7YysrKWI9CnRoaXMuY2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuVWd8fGdhLFI9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnI9dGhpcy5hWzEwXTt0aGlzLm9wPXRoaXMuYVszXTt0aGlzLnJoPXRoaXMuYVs2XTt0aGlzLmRtPXRoaXMuYVs2XTt0aGlzLmx1PXRoaXMuYVszXTt0aGlzLnB0PXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVsxMF07dGhpcy5obz10aGlzLmFbMTBdO3RoaXMuUm09dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzhdfWMudmk9YjtiLnByb3RvdHlwZT17YXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJyOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5xaChhKX0scWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJoOnRoaXMuY20oYSl9LApjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmRtOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sdTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHQ6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRoOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYz1jLnZpfHxHYyx2ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj12ZC5hcig0KX0pLmNhbGwobmFlR2hhaVRFaWtlaXNpZSxuYWVHaGFpVEVpa2Vpc2llKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.220.226 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.226.220.76.144.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.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964; s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]; __gads=ID=78a6ac6d7af67528:T=1536589718:S=ALNI_MYvYVimTcb8GVmRj4yhsb2D8tOpVg
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Last-Modified
Fri, 10 Aug 2018 12:19:04 GMT
Server
openresty/1.13.6.2
ETag
"5b6d82b8-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
/
ssl.3.damoh.chip.de/ce5b7121216203fc074fd8b5e36d86543fec99bb/
109 B
670 B
XHR
General
Full URL
https://ssl.3.damoh.chip.de/ce5b7121216203fc074fd8b5e36d86543fec99bb/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIG5hZUdoYWlURWlrZWlzaWU9bmFlR2hhaVRFaWtlaXNpZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3kuWGR8fCh5LlhkPTApO3kuWGQrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5YZCYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihrKXtrLnBhdXNlQnV0dG9ufHwoay5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOMFEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1FqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzUXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGdIbkNyRUFBQUYwU1VSQlZIamE3Sm05aW9OQUVNZmozUlVXOFNNYVB3aGEyNGNJMWxaV2VZTFkrUVNXZ3BXK2c0K1VKbThSdFUxTWltRGxMYmNnd1NQSFFjTGV6akZUelE0eSs5dmhQeVBMQ2ttU3pLRFp4K2wwZ2dkOVBwL2hRZDl1TjNqUXd6QWdOQXQ3bXdFMGxBZENZeU5pcFJFYU5ZMlZSbWlRME52dE5neERTWktxcWpvY0RtTjh0VnJ0ZGp2UDg5cTJ6Zk9jSStqTlpsT1dKZlVKWHhSRjErdVZMb3VpOEgyZitrM1RrQ1B4TWozaU9CNTlXWllKOTNpQWtaall2Zi8zbFNhcW1FUm8ya2R4THFBblNZWXYreUhPNC9SNEJNMVhwUmxENDIvOEZ4WEZSa1JOZzlRMHlKR0hqWWp5d09tQmpmaWZHN0d1Ni92bDhYaWthWWt6K2V3bDI3MlQyOUh6V2ZiNy9YcTlkbDIzNjdvc3k4aVN4aStYQ3dFTmdrQVVSUkpNMDdUdisrZTNFeHpId1VaRTZFZWFucy9uNEtBRjI3WVJtZ20wWlZud29FM1RoQWR0R0FZODZPVnlpZEJNb0hWZGh3ZXRhUm84Nk1WaUFROWFWVldFWmdLdEtBbzg2SmZjWEZoRGYzL0w0ZDgrQlJnQStSTldTeFBpUjR3QUFBQUFTVVZPUks1Q1lJST0iLz4nKTsKay5wbGF5QnV0dG9ufHwoay5wbGF5QnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU56azJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzTnpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNPRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlZrR0lrQUFBSFpTVVJCVkhqYTdKZ3hpc0pRRUlaMVhiQlJtd2hpRGlCNmdVMHRwQklFQzR1QWhVME1CRnZGWHEwVlBFQ0NWb0xhZWdHTGlLV0ZIaUNranJHeGpMTXVpR3pBM2VVbHovZlkrYXNRblBCbC9PZGxadUtxcXNaNDA3dnJ1dnhCbjA0bi9xQXZsd3QvMEw3dkl6UU52Y1U0Rk5vRG9iRVFNZE1Jalo3R1RIOHFrY3ZsU09MVDZYUzlYdC92OTFUdDRaT3BXcTEydTkzNWZKNUtwWHhhSW9XR1RNT3JGNHZGOVhwZEtCVDRnTDZYUkNhVFdTd1dqVWFEQm5TNGJ1djFlb1BCNEN2OTdIbzYrTVJhcldZWVJqNmY1OEFlandLTEw1ZkxjcmtjRVhRaW04MlMvRk1mTndYdko1UEpTcVVDRjd2ZGpqbDdQUDgydGR2dHlXUVMrbWtZK1dkY2x1WHBkQXFHWWJvUWd5cVZTc0FOQlJxYXB3VkJJUFMwSkVrLy9nd3NEaW1IbzNDejJmQ1I2YnVhemVac05pTzNPTzNXVkxycHhhM3BuOExQNTdPdTYrU0hJTDErK25BNEFMSGpPSzhmQW40WmJwcm1jRGprWm5JQlMwQUx0VnF0R0JxM25vZURKVHFkenZGNDVHYXdoWjVKVVpUUWlTTzBSNy9maHdhVjBXazhHRzdidHFacFlBeHVWZ2lXWmJWYUxTZytwdmNlaitHajBXZzhIdE5ZMW9UeUZNL3pWRlhkYnJlVWxqV0VReWdNNGREQkFYR2tKdjZtdUNpS3VNdERhRnoxSWpSQ1l5RmlwaEVhb2JFUUVmb2ZRVjhGR0FCR0VKNFU1RklmendBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay5tdXRlQnV0dG9ufHwoay5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRakEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM1JqWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFU0TURZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHJXZjM4Y0FBQUpVU1VSQlZIamE3Sm0vandGQkZNZTV1M0pSYzlSRWZmd0JMbEdpb0hJNmpXdjlBVlJYaWVnRkNZMndDanIwNGgvZ0w5RDcwWWhxNzV1ZFpDTHJkdG5kMmMzTjNieGk4cXpkTjU5NTcvdG03ZktXeTJVUGIvYXkzKy81Z3o0Y0R2eEJuODluL3FBVlJSSFFidGlUaDBNVDhoRFFvaEZGcGdXMDBEUjdhSVdwMWV0MXhYbGpCaTFKMG5BNHpHUXlMa0N6MGJUUDUydTMyOUZvRkw0TFRjSUFPaFFLdFZxdFdDeEdQaktCUnNVd3ptWXpSNkNSM1c2MzYvZjc2UkU3QWJQWkxNYnBkSXF3eUFJYzlydkhMYkUxKzFBTnpwdHFjR2pkR084ZXFLQXN5N2ZFajBjb0ZvdVZTZ1VPWVlYenFocXRsZWxHUktWeXVaekJjcFBKNUkvSDc4cWpWQ3BoSEF3R2lVUUNIWXp6TVZKRWpXTk8wMWl4SHBheDZRV2tyS2xVQ2s2LzM2ZXNtZ3R2SFJQeXNDWlFUWkJQMWVDOHEvWUk0bDE1T0hVYi8xS05xTWhheFZ6OXdVUUNRbDJQcDlPc1BIU2g3Y2pqZXJUcHVKcHBKZ25XYmNRLzliaGxVeDZPWnBwTGVUaVY2Y1ZpZ1RzOFo0M1k2L1hJeDhsa1FnNmVUaWV5ak4rYmFXcjRVVVVkQW0yQlhndXROL2R1dDF1djEzcmZZdFo0UEc1cU1jdmxVck1NVEJFT2gxbnVIckpxQmxjMkdvMThQbStoUkpEN3RZUHpRVytjZTJhYXJsYXJtODJtVnF0WjF0VjhQcjkyY09IeGVIUzhFVHVkRHFacE5wczJtNEhTajhkakVtRzczVUk1VHUwZW1JWndCd0lCKzgrSWxINjFXaG1FOGxwckJZMmhLVWVqRWVHT1JDSjh2R0dDdUF1RndyVWkrWGpEQk81ME9vM1JCV2h2TUJoa1dEanNYTGgzT0MyUFowbVNHSWE3WEM3aVZhLzRKMEJBL3c5bzBZZ0NXa0NMUmhUeUVORE03VnVBQVFCd292dkl2MDlZNmdBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKay51bm11dGVCdXR0b258fChrLnVubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnNraXBhYmxlQnV0dG9ufHwoay5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC42O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0pO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTsKay5za2lwQnV0dG9ufHwoay5za2lwQnV0dG9uPSc8ZGl2IHN0eWxlPSJtaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7b3BhY2l0eTogMC42O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctbGVmdDogNnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQThBTlVBQUE4UER5a3BLUzB0TFJNVEV4WVdGaDRlSGlNakkyUmtaQ0lpSWlzckt4RVJFU29xS2pNek16SXlNamMzTnpvNk9pOHZMeGtaR1RZMk5rTkRReElTRWhzYkd4Y1hGeVFrSkNjbkp4OGZIeTR1TGhVVkZUazVPUjBkSFEwTkRWTlRVeUVoSVRVMU5Sb2FHZzRPRGlZbUpqQXdNQ0FnSUJBUUVEUTBOREV4TVJRVUZEZzRPQ2dvS0JnWUdDVWxKU3dzTEJ3Y0hBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDSC9DMWhOVUNCRVlYUmhXRTFRUEQ5NGNHRmphMlYwSUdKbFoybHVQU0x2dTc4aUlHbGtQU0pYTlUwd1RYQkRaV2hwU0hweVpWTjZUbFJqZW10ak9XUWlQejRnUEhnNmVHMXdiV1YwWVNCNGJXeHVjenA0UFNKaFpHOWlaVHB1Y3pwdFpYUmhMeUlnZURwNGJYQjBhejBpUVdSdlltVWdXRTFRSUVOdmNtVWdOUzQyTFdNeE16Z2dOemt1TVRVNU9ESTBMQ0F5TURFMkx6QTVMekUwTFRBeE9qQTVPakF4SUNBZ0lDQWdJQ0FpUGlBOGNtUm1PbEpFUmlCNGJXeHVjenB5WkdZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6RTVPVGt2TURJdk1qSXRjbVJtTFhONWJuUmhlQzF1Y3lNaVBpQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRiRzV6T25odGNFMU5QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YlcwdklpQjRiV3h1Y3pwemRGSmxaajBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDNOVWVYQmxMMUpsYzI5MWNtTmxVbVZtSXlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRk9UWkRRalZHTTBSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdORVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPa1U1TmtOQ05VWXhSRVl4TWpFeFJUWTROREZCUlVFM1EwWXhRekk1T1RFMUlpQnpkRkpsWmpwa2IyTjFiV1Z1ZEVsRVBTSjRiWEF1Wkdsa09rVTVOa05DTlVZeVJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWk4K0lEd3ZjbVJtT2tSbGMyTnlhWEIwYVc5dVBpQThMM0prWmpwU1JFWStJRHd2ZURwNGJYQnRaWFJoUGlBOFAzaHdZV05yWlhRZ1pXNWtQU0p5SWo4K0FmLysvZno3K3ZuNDkvYjE5UFB5OGZEdjd1M3M2K3JwNk9mbTVlVGo0dUhnMzk3ZDNOdmEyZGpYMXRYVTA5TFIwTS9PemN6THlzbkl4OGJGeE1QQ3djQy92cjI4dTdxNXVMZTJ0YlN6c3JHd3I2NnRyS3VxcWFpbnBxV2tvNktob0orZW5aeWJtcG1ZbDVhVmxKT1NrWkNQam8yTWk0cUppSWVHaFlTRGdvR0FmMzU5Zkh0NmVYaDNkblYwYzNKeGNHOXViV3hyYW1sb1oyWmxaR05pWVdCZlhsMWNXMXBaV0ZkV1ZWUlRVbEZRVDA1TlRFdEtTVWhIUmtWRVEwSkJRRDgrUFR3N09qazROelkxTkRNeU1UQXZMaTBzS3lvcEtDY21KU1FqSWlFZ0h4NGRIQnNhR1JnWEZoVVVFeElSRUE4T0RRd0xDZ2tJQndZRkJBTUNBUUFBSWZrRUFBQUFBQUFzQUFBQUFBRUFQQUFBQmpmQXcyZnk0S3hXRGtrSWhXSTBVcWtTUkNONHZSS0xBSXVGSWJsY0Z3TUNaREpsQ2gwWXJDS0t0Rm9Xd2thbEdsQVVweE5nNUFrQ0FEcz0iKTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBWUFBQUE2L05seUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBM0JwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRNNElEYzVMakUxT1RneU5Dd2dNakF4Tmk4d09TOHhOQzB3TVRvd09Ub3dNU0FnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdUVTA5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5dGJTOGlJSGh0Ykc1ek9uTjBVbVZtUFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdmMxUjVjR1V2VW1WemIzVnlZMlZTWldZaklpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGNFMU5Pazl5YVdkcGJtRnNSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZSamMzT1VGR01FUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdUVTA2U1c1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRlJqYzNPVUZGUmtSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0krSUR4NGJYQk5UVHBFWlhKcGRtVmtSbkp2YlNCemRGSmxaanBwYm5OMFlXNWpaVWxFUFNKNGJYQXVhV2xrT21Rell6azFOREJtTFRWbFlUTXRORGxsTkMxaE5HVXlMV1EyTWpReU5UY3pabVU1WVNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUG02WE5UNEFBQUpxU1VSQlZIamFZdnovL3ovRFNBSk1EQ01NakhwNDFNT2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2g3RUJsc0htSUVORHd3QnM0dWZQbjk5QUZRdEFBd0RVeGpZMk5qRmRYVjByOWZYMS9ValZDOVdEQXNneEJ4ZW1TWkwyQllMUzB0S3dGU3RXckFSNlBncmtZRklpZ0JpeFFaV0hlWGw1ZVVDMGhvWUd4N1p0MjVhcUFZR2VucDRQa1I3K1I0ellvUEl3Y296dzhmRXhyRjY5dWpzYUNIUjFkWDBHT29icFZtaVZsNWRIcUt1cmExaFpXZkVjTzNac3hZZ29wUU1DQWd5QXlYeSttNXNienpNZ3VITGx5cmJoa3FSeE9oQ1VyOWVzV1RQYkVRaTB0Ylc5aGtXaFJRaUE4dlhreVpOTHNyS3lNclcwdER5R1ZhR0ZEMlJuWi90TW1qUnBzcG1aV2Npd0s3UndBUmNYRnhWcGFlbUZnWUdCTWplQVlFUzBwVFUxTmJrV0xsellEeXpVL0dtZHBGbG9sS1Qva1pPdjI5dmJNNENGbXNhd0s3VHdnZmo0ZUljaFYyaU51UDR3SlVudzA2ZFBEQ01tU1YrN2R1MGJzS01WUDZ4YVdyakEvUG56OTRHNmxVK0FZRmpITUNnSkEvdk9VNXFCNE83ZHUvdUdhclZFZEJJdUtTa3B2bjc5K28zNzkrOGZHTll0TFdBSDRreFRVMVBqcFV1WHRnemI3aUVNQUQyNmFONjhlWE1mUEhod2lON2RRN3EydEI0L2ZzeVFscGFXQ1V6SzF4NCtmSGhvV0k5NEhEOSsvRmtxRUFBTHFVK1BIajA2UWtwZ0RibENxNit2YjEwL0VBQmorQWc1QmQ2UWllR1BIejh5cEtTa2xKNEFBbUk4TzJTYmxsZXZYcjJ5WThlT0crN3U3dUhBcEh5TUZNL1NPa25UWk9hQkVpd2xKV1dGUHZNQUZhT0srWU51YmdrVW0wQVBXdExLZk1iUnhhV2pIaDcxOEtpSFJ6MDg2dUZSRDQ5NmVOVERveDRlOWZDb2gwYzlQT3BoQmdhQUFBTUFHbUMwcGVKY0dFSUFBQUFBU1VWT1JLNUNZSUk9Ii8+PC9kaXY+Jyk7CmlmKGsuc2lkZWxvYWRzKXt2YXIgYz1mdW5jdGlvbigpe307ay5zaWRlbG9hZHMuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1hLmFsaWFzOyJmdW5jdGlvbiI9PT10eXBlb2YgYiYmKGI9YigpKTthPWEudXJsOyJmdW5jdGlvbiI9PT10eXBlb2YgYSYmKGE9YSgpKTtlLkxhKGEsYixbXSxjLGMsbSl9KX1tLmMoay5nbG9iYWxDb25maWcsay5jbGllbnRDb25maWcsay5wcmVjaGVja2VkLGsub25SZWFkeSxrLm9uRmFpbHVyZSxrKTtkb2N1bWVudC5oZF9yZWFkeT0hMDt2YXIgYj1rLnN0YXJ0UGxheWVyO2ImJiJmdW5jdGlvbiI9PT10eXBlb2YgYiYmYigpfWVsc2UgZWEoZGEsNTApfWZ1bmN0aW9uIGZhKGMsYil7Ynx8KGI9InByZSIpO2lmKGsmJm0pe2MucGF1c2UoKTt2YXIgYT1uZXcgTihjKSxhPW5ldyBPKGEsbSksZz1rLmFkVGFnOyJwcmUiPT1iJiZrLnByZXJvbGxBZFRhZyYmKGc9ay5wcmVyb2xsQWRUYWcpOyJwb3N0Ij09YiYmay5wb3N0cm9sbEFkVGFnJiYoZz1rLnBvc3Ryb2xsQWRUYWcpOwpnJiYoYS5wZyhrKSxhLk9kKGcpKX1lbHNlIGVhKGZ1bmN0aW9uKCl7ZmEoYyl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIHEoYyxiKXtpZihrJiZtKXsoay5hZFRhZ3x8ay5wcmVyb2xsQWRUYWcpJiZjLnBhdXNlKCk7ZS5EKGwuQWMsYy5CKCkpO2lmKGMuZ2V0Q3VycmVudFRpbWUpe3ZhciBhPWMuZ2V0Q3VycmVudFRpbWUoKTthJiZlLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9tLm9hPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGdhO2EuYWQoYyk7YS5adChtKTthLll0KGspO2EuSXQoKTthLmIoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cShjLGIpfS5iaW5kKHRoaXMpLDUwKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vaz10aGlzLmFbOF07dGhpcy5BdD10aGlzLmFbNF07dGhpcy5ncD10aGlzLmFbN107dGhpcy5Rdj10aGlzLmFbOV07CnRoaXMuJG49dGhpcy5hWzddO3RoaXMucG49dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbMTBdfWMuV3E9YjtiLnByb3RvdHlwZT17bms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLm9rOnRoaXMuenQoYSl9LHp0OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5BdDp0aGlzLmZwKGEpfSxmcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZ3A6dGhpcy5QdihhKX0sUHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlF2OnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy4kbjp0aGlzLm5uKGEpfSxubjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYT1jLldxfHxoYSxIYz1uZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9SGMubmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRmE9InNldHVwIjt0aGlzLmZjPVtdO3RoaXMuWmUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy52dC5iaW5kKHRoaXMpKX1jLmZqPWI7Yi5wcm90b3R5cGU9e1plOmZ1bmN0aW9uKCl7dGhpcy5sYT17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LGxuOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YSYmYS5wb3N0TWVzc2FnZSYmYS5wb3N0TWVzc2FnZShiLAoiKiIpfSx6YTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sdnQ6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMudXQoYS5kYXRhKX0sdXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTA7Yjx0aGlzLmxhLmV2ZW50bGlzdGVuZXIubGVuZ3RoO2IrKylhLmV2ZW50PT10aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSx1ZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxhZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmZxKGEpLGQ9ITE7aWYoYilyZXR1cm4gYT1hLnJlcGxhY2UoYiwiIikrIi9kZXYvaG9tYWRfdXJsLyIrYisiLyIsYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywKIi9kZXYvaG9tYWRfdXJsIiksYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLHRoaXMuVWYoYSwiUE9TVCIse30sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxmcTpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8Yls1XSkpe2lmKGJbMl0pcmV0dXJuIGJbMl07aWYoYls1XSlyZXR1cm4gYls1XX1lbHNlIGlmKGI9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSxqbjpmdW5jdGlvbihhLApiKXthPT1iJiYoKGI9dGhpcy5hZihhKSl8fChiPWEpKTswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGxmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrYSxiLCEwKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuImFib3V0OmJsYW5rIj09YXx8ImFib3V0OnNlbGYiPT1hfHwiIj09YX0sRWE6ZnVuY3Rpb24oYSl7aWYoIWF8fCJvYmplY3QiIT09dHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmCmIrKztyZXR1cm4gYn0sc2Y6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LEV1OmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LExmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1hLnRvcCYmMDw9YS5sZWZ0JiZhLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LE1mOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAsYz0wLGg9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2Y9dS5oZWlnaHQ7MD51LnRvcCYmKGYrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGYtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPnUubGVmdCYmKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJgooZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZik7aD49YiYmKGU9ITApO3JldHVybiBlfSxsYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sR2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGY7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZj0KYS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxzZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxoPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGY9MDtmPG4tMztmKz00KWM9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykscC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PAoyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChmKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT1wW2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09ZChoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtjPWU7bj11O2w9azt3PUk7cT1tO2ZvcihmPTA7MTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8fm4mdykrcStoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTIwOzM5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpKwpxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGY9NDA7NTk+PWY7ZisrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihmPTYwOzc5Pj1mO2YrKylyPWQoYyw1KSsobl5sXncpK3EraFtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtlPWUrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGgsZSx1LGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0KKGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihmKT9lPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LHNyOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sZGY6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLApkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5vbz8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmCiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWnA6ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLmRmKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWWE6ZnVuY3Rpb24oKXt2YXIgYT17Rmg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sClBoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LExxOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHdrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LG9tOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxsbzpmdW5jdGlvbigpe3JldHVybiBhLkZoKCl8fGEuUGgoKXx8YS5McSgpfHxhLndrKCl8fGEub20oKX19O3JldHVybiBhLmxvKCl9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPWFbZl18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxmPTAsYz1hLmxlbmd0aDtmPGM7KytmKWIuaGFzT3duUHJvcGVydHkoYVtmXSl8fChkLnB1c2goYVtmXSksYlthW2ZdXT0xKTtyZXR1cm4gZH0seWY6ZnVuY3Rpb24oYSl7YT10aGlzLk1hKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0samI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sYXA6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZj1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGYucHVzaChhW2NdKTtyZXR1cm4gZn0sQXU6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxwZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuR2coYikrIjoiK3RoaXMuR2coTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LEdnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5GYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmO2Quc3RhdGU9dGhpcy5GYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChmKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZixjKXt2YXIgaD1hO2QmJmImJihiPWwuSGMoYixkKSk7YiYmKGg9bC5IYyhhLGIpKTtmJiYoaD1sLkhjKGgsZikpO2MmJihoPWwuSGMoaCxjKSk7ZS5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlopd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1tLmdlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLkthKGYsITApO2Y9bS5LYShmLCEwKTtmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtmLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2YuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkdhKGYsZnVuY3Rpb24oZCl7dmFyIGY9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGY9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGY9CiExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFBkOmZ1bmN0aW9uKCl7bSYmbS5aP20uaXNFbmFibGVkJiZtLklvKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBkKCl9LmJpbmQodGhpcyksNTAwKX0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToiIn0sTWM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5GZChhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJgooYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifSx4bzpmdW5jdGlvbihhLGIsZCl7ZD0hMTtpZihiLlJjKGEpfHx0aGlzLnVyKGEpfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5uZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94Lm5nWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5sZihhKSlyZXR1cm4gdGhpcy5sZihhKTt2YXIgZj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtmLmhvbWFkX3VybF9zdWZmaXg9YTtmLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMueWIoYSk7Zi5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2YuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7ZCYmKGYuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7dmFyIGM9ITE7ZD0hMTtkPXRoaXMuTGEoYSxiLnZhLGYsZnVuY3Rpb24oYSl7Yz1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtjfHwoYz1kKSxjPUpTT04ucGFyc2UoYyl9Y2F0Y2goaCl7Yz0hMX1jLnVybCYmYy5oYXNoJiYoYz1iLlBjKCkucmVwbGFjZSgiW2hhc2hdIixjLmhhc2gpKTt0aGlzLmpuKGMsYSk7cmV0dXJuIGN9LExhOmZ1bmN0aW9uKGEsYixkLGYsYyxoLGUsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlopaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLkthKGEsaCk7aD1rLkthKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09CmRbcV07cmV0dXJuIGsuR2EoaCxmLGMsIiIsIiIsZSl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxhKGEsYixkLGYsYyxrLGUsdSl9LmJpbmQodGhpcyksNTAwKX0sVWY6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSl7dmFyIHU9ITA7ZSYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7ZT1kO2Q9IiI7Zm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LFlyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLlVmKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmZjKWZvcih2YXIgYyBpbiB0aGlzLmZjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZmNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnliKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sVmY6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07CmMuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy55YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuTGEoYSxmLnZhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5ZcihmLlBjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxldTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5mYz1hfSxldzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuTGEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsCmQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sbW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSwKYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxxcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5manx8UDtuZXcgUDt2YXIgZT1uZXcgUDt3aW5kb3cuRHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5laj1iO2IuSGM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLm10PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLk92PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9OwpiLkJwPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuJHY9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hbj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5WbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuWW09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuY249e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLlVtPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLldtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIiwKbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLnl2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5DcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuVnY9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTm89e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Tbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuQmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IiwKbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuQWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLiRtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5abT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUGU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9lPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLmRuPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5YbT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IudnY9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLmVqfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLklyPXRoaXMuYVs3XTt0aGlzLm5pPXRoaXMuYVs0XTt0aGlzLmxsPXRoaXMuYVs4XTt0aGlzLm5zPXRoaXMuYVsxXTt0aGlzLlRtPXRoaXMuYVs0XTt0aGlzLmxrPXRoaXMuYVs2XTt0aGlzLldsPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMuVXY9YjtiLnByb3RvdHlwZT17SHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5Jcjp0aGlzLm1pKGEpfSxtaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmk6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmxsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5uczp0aGlzLlNtKGEpfSxTbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlRtOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sazp0aGlzLlZsKGEpfSxWbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLldsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgaWE9Yy5Vdnx8aWEsSmM9bmV3IGlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMuSHIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5naj0KYjtiLnByb3RvdHlwZT17R2Q6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxpcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHwKbmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sSWM6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkljKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuSWMoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxZYjpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkdkKHRoaXMuZmIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5JYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sbHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYigpKwoiMiJ9LEpmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuR2QodGhpcy5pcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkljKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUT1jLmdqfHxRO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnNtPXRoaXMuYVsxMF07dGhpcy5VcD10aGlzLmFbMl07dGhpcy5Ydj10aGlzLmFbMV07dGhpcy52cD10aGlzLmFbM107dGhpcy54bT10aGlzLmFbN107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5ScT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs3XX1jLnJwPWI7Yi5wcm90b3R5cGU9e3JtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5zbTp0aGlzLlRwKGEpfSxUcDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlVwOnRoaXMuV3YoYSl9LFd2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Ydjp0aGlzLnVwKGEpfSx1cDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnA6dGhpcy53bShhKX0sd206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnhtOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ibzp0aGlzLlFxKGEpfSxRcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlJxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgamE9Yy5ycHx8amEsS2M9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2Mucm0oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOgovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGY9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZltjXT0iZnVuY3Rpb24iPT09dHlwZW9mIGdbY10mJiJmdW5jdGlvbiI9PXR5cGVvZiBkW2NdJiZhLnRlc3QoZ1tjXSk/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGY9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGZ9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGYuYz9mLmhhc093blByb3BlcnR5KCJpbml0Iik/Zi5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLkJlPWJ9KShjKTt2YXIgSj1jLkJlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5paT10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs3XX1jLkNpPWI7Yi5wcm90b3R5cGU9e2hpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5paTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGthPWMuQ2l8fGthLExjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUxjLmhpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2MuTGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy55YT17fTt0aGlzLkE9bnVsbDt0aGlzLmNjPTEwMDt0aGlzLm5iPTA7dGhpcy54YT0xNTA7dGhpcy5zYj0wO3RoaXMuJHQoYil9LGI6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhPyh0aGlzLm5iKyssdGhpcy5zYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmNjKSk6CjA+dGhpcy54YSYmKHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYykpfSxMdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5iPnRoaXMueGE/ITA6ITF9LGxnOmZ1bmN0aW9uKCl7dGhpcy5uYj0wfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sJHQ6ZnVuY3Rpb24oYil7dGhpcy5BPWJ9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX0sSjpmdW5jdGlvbihiKXt0aGlzLnlhW2IuZmIoKV09YjtLJiZLLlNmJiZLLkZ1KGIpfSxMdzpmdW5jdGlvbigpe3JldHVybiBlLkVhKHRoaXMueWEpfSxIOmZ1bmN0aW9uKGIpe3ZhciBhPWIudmlkZW9UYWcsZztmb3IoZyBpbiB0aGlzLnlhKWlmKGE9PXRoaXMueWFbZ10udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMueWFbYi5mYigpXT8hMDohMX0scnI6ZnVuY3Rpb24oYil7Yj1iLkRhKCk7Zm9yKHZhciBhIGluIHRoaXMueWEpaWYoYi5pZD09dGhpcy55YVthXS5EYSgpLmlkKXJldHVybiEwOwpyZXR1cm4hMX0sWnc6ZnVuY3Rpb24oYil7dGhpcy55YVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHI9Yy5Ma3x8cjsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLmNjPTEwO3RoaXMubmI9MDt0aGlzLnhhPTUwO3RoaXMuSz1udWxsO3RoaXMuamE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLmhiPSIiO3RoaXMuZmY9ITE7dGhpcy5OKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCOmZ1bmN0aW9uKCl7dmFyIGI9e30sYT10aGlzLnZpZGVvVGFnLGc9dGhpcy5EYSgpLGQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9ZyliLmNvbnRhaW5lcklkPWcuaWQ7ZCYmKGIucGxheWVyPWQpO3JldHVybiBifSxOOmZ1bmN0aW9uKCl7fSxlYTpmdW5jdGlvbigpe30saXU6ZnVuY3Rpb24oYil7dGhpcy5LPWJ9LApNdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkt9LGN1OmZ1bmN0aW9uKGIpe3RoaXMuVGQ9Yn0sS3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UZH0sU2Q6ZnVuY3Rpb24oKXt9LEk6ZnVuY3Rpb24oKXt0aGlzLm5iPD10aGlzLnhhJiYodGhpcy5uYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTi5iaW5kKHRoaXMpLHRoaXMuY2MpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHJmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LGtlOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sJHc6ZnVuY3Rpb24oKXt9LFM6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMuR3EoKXx8CnRoaXMuZm4oKTt0aGlzLmtlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUucGEoMTApKX0sR3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFA6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sUWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGtiOmZ1bmN0aW9uKCl7cmV0dXJuITF9LApUdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxkYTpmdW5jdGlvbigpe3RoaXMuamE9ITB9LERiOmZ1bmN0aW9uKCl7dmFyIGI9aztyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFhhOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE1kOmZ1bmN0aW9uKCl7cmV0dXJuITF9LHFnOmZ1bmN0aW9uKGIpe3RoaXMuaGI9Yn0sSnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYn0sS3Q6ZnVuY3Rpb24oKXt0aGlzLmhiPW51bGx9LFB3OmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5oYiYmKGI9ITApO3JldHVybiBifSxWdzpmdW5jdGlvbigpe3RoaXMuZmZ8fCh0aGlzLmZmPSEwKX0sSmM6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sR3c6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMudmlkZW9UYWc7YSYmYS5nZXRBdHRyaWJ1dGUoImlkIikmJihiPWEuZ2V0QXR0cmlidXRlKCJpZCIpKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBwPWMuTmt8fHA7KGZ1bmN0aW9uKGMpe2MuVmc9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYiwKYSl7dGhpcy5BPXRoaXMucGxheWVyPSIiO3RoaXMuS2U9IjEiO3RoaXMuTGU9IjIiO3RoaXMuSG09IjMiO3RoaXMua2M9MDt0aGlzLllmPTMwO3RoaXMudmI9W107dGhpcy5RYT1bXTt0aGlzLkxiPXtleHRlcm5hbDoxLG5vZnJhbWV3b3JrOjIsYWRlcnJvcjozLGNvbnRlbnRwbGF5OjQsbm9BZHNNYW5hZ2VyOjUsdW5rbm93bjo2fTt0aGlzLlJlPXRoaXMuS2c9ITE7dGhpcy5zdGF0dXM9dGhpcy5rYzt0aGlzLmlkPWUucGEoMTApO3RoaXMuYWQoYik7dGhpcy5hdShhKX0sYjpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLktnfHwodGhpcy5LZz0hMCxlLlBkKCkpfSxXZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuTCgpO1ImJlIuWmImJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIitiKSl9LHc6ZnVuY3Rpb24oYixhKXt2YXIgZz0hMDtiJiYoZz0hMSk7cmV0dXJuIHRoaXMuaGEoKT8hMToodGhpcy5mdSgpLHRoaXMuQSh0aGlzLmdldFBsYXllcigpLApnKSx0aGlzLkNnKCksdGhpcy5SZT0hMCxhJiYiZnVuY3Rpb24iPT10eXBlb2YgYSYmYSgpLCEwKX0sbDpmdW5jdGlvbihiLGEpe3RoaXMuaGEoKXx8KHRoaXMudmIucHVzaChiKSx0aGlzLlFhLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxDZzpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMudmImJjA8dGhpcy52Yi5sZW5ndGgmJih0aGlzLnZiPWUudW5pcXVlKHRoaXMudmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLnZiLmpvaW4oIiwiKSkpO2lmKHRoaXMuUWEpe2Zvcih2YXIgZz0wO2c8dGhpcy5RYS5sZW5ndGg7ZysrKXRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPT10aGlzLkxiW2JdJiZhLnB1c2godGhpcy5RYVtnXS5kZXRhaWwpLHRoaXMuTGJbdGhpcy5RYVtnXS5yZWFzb25dPHRoaXMuTGJbYl0mJihhPVtdLGEucHVzaCh0aGlzLlFhW2ddLmRldGFpbCksYj10aGlzLlFhW2ddLnJlYXNvbik7dGhpcy5MYltiXXx8KGI9InVua25vd24iLGE9W10pOwowPGEubGVuZ3RoJiYoZz1lLnVuaXF1ZShhKSxiPWIrIi0iK2cuam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxPdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJlfSxtOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5LZX0sZnU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkxlfSxndTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSG19LG9iOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5rY30sTWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuS2V9LHV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkxlfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5rY30sYWQ6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9Yn0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxhdTpmdW5jdGlvbihiKXt0aGlzLkE9Yn0saHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSwKYXM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdD1jLlZnfHx0O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmdrPXRoaXMuYVsxXTt0aGlzLmZ0PXRoaXMuYVsxMF07dGhpcy5ObT10aGlzLmFbNF07dGhpcy5paz10aGlzLmFbNV07dGhpcy5RbD10aGlzLmFbNl07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy50aD10aGlzLmFbOV07dGhpcy5Ucz10aGlzLmFbNF07dGhpcy5Qbj10aGlzLmFbOF07dGhpcy5nPXRoaXMuYVs0XX1jLnBvPWI7Yi5wcm90b3R5cGU9e2ZrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nazp0aGlzLmV0KGEpfSxldDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZnQ6dGhpcy5NbShhKX0sTW06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5tOnRoaXMuaGsoYSl9LGhrOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5pazp0aGlzLlBsKGEpfSxQbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlFsOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuWWw6dGhpcy5zaChhKX0sc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnRoOnRoaXMuU3MoYSl9LFNzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Uczp0aGlzLk9uKGEpfSxPbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlBuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWE9Yy5wb3x8bWEsTWM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TWMuZmsoNCk7KGZ1bmN0aW9uKGMpe2MuZGk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnJiKGIpfS5iaW5kKHRoaXMpKX0scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuSyYmdGhpcy5LKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFM9Yy5kaXx8UzsoZnVuY3Rpb24oYyl7Yy5jaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMua2Q9bnVsbDt0aGlzLkR2PTFFMzt0aGlzLmVnPW51bGw7dGhpcy5ldj0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cub28pYi5vbigicGxheSIsCmZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Iub24oImRpc2FibGUiLHRoaXMuTXAuYmluZCh0aGlzKSk7Yi5vbigiYWR0aW1lb3V0Iix0aGlzLkNxLmJpbmQodGhpcykpO2Iub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuQnEoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkd2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5IdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLkFxKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5RbyhhKX0uYmluZCh0aGlzKSl9LFFvOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sR3Y6ZnVuY3Rpb24oYil7dGhpcy5rZHx8KHRoaXMua2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkl2KGIpfS5iaW5kKHRoaXMpLAp0aGlzLkR2KSl9LEl2OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmtkKTt0aGlzLncoKX0sSHY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMua2QpfSxBcTpmdW5jdGlvbihiKXt0aGlzLkJ3KGIpO3RoaXMuZWc9bmV3IERhdGU7dGhpcy5lZy10aGlzLnJ0PHRoaXMuZXY/dGhpcy53KCk6dGhpcy5tKCl9LENxOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMuYWQobmV3IFMoYSkpKTt0aGlzLncoKX0sTXA6ZnVuY3Rpb24oKXt9LEJxOmZ1bmN0aW9uKCl7dGhpcy5ydD1uZXcgRGF0ZX19KX0pKGMpO3ZhciBuYT1jLmNpfHxuYTsoZnVuY3Rpb24oYyl7Yy5laT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkVhKHZpZGVvanMucGxheWVycykpe3ZhciBiPQp2aWRlb2pzLnBsYXllcnMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPW5ldyBTKGJbYV0pO3RoaXMuSChnKXx8KHRoaXMuSihnKSwobmV3IG5hKGcsdGhpcy5BKSkuYigpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIG9hPWMuZWl8fG9hLHBhPW5ldyBvYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Eaz10aGlzLmFbMV07dGhpcy5TbD10aGlzLmFbN107dGhpcy5LaT10aGlzLmFbM107dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVszXX1jLlFyPWI7Yi5wcm90b3R5cGU9e0NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Eazp0aGlzLlJsKGEpfSxSbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2w6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuSW46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBxYT1jLlFyfHxxYSxOYz1uZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1OYy5Dayg0KTsoZnVuY3Rpb24oYyl7Yy5zaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3RoaXMua2YoKTt0aGlzLm1mKCk7dGhpcy5Sbz0hMX0sa2Y6ZnVuY3Rpb24oKXt0aGlzLiRiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtifHwodGhpcy4kYj0hMCk7aWYoIk9CSkVDVCI9PWIubm9kZU5hbWV8fCJWSURFTyI9PWIubm9kZU5hbWUpYj1iLnBhcmVudE5vZGU7dGhpcy5QKGIpfSxtZjpmdW5jdGlvbigpe2lmKCF0aGlzLiRiKXt2YXIgYj10aGlzLkRhKCksCmE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuJGI9ITApO3RoaXMuUyhhKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLksmJigwLHRoaXMuSykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5LJiYoMCx0aGlzLkspKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuSyYmKDAsdGhpcy5LKSgpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpfSxjZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJgp0aGlzLlRkJiYoMCx0aGlzLlRkKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxrYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxKYzpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcixhPSExO2IuZ2V0Vm9sdW1lJiZiLmdldFZvbHVtZSgpJiYoYT1iLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciByYT1jLnNqfHxyYTsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxvYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMua2M7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5tYz0hMTt0aGlzLnNkPTE7dGhpcy5vYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5zZD1hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMuYmI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmJiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMubWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJgpiLl9ldmVudHMuYWRDbGljayYmYi5fZXZlbnRzLmFkQ2xpY2sucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZENsaWNrIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLldkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkVGltZSYmYi5fZXZlbnRzLmFkVGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkVGltZSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5ZZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbSYmYi5fZXZlbnRzLnBsYXlsaXN0SXRlbS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7aWYodGhpcy5oYSgpJiYodGhpcy5vYigpLHRoaXMuZ2V0UGxheWVyKCkuUm89ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmhiO2EmJihhLllkKCksYS5zYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5tYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuV2QoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTsKaWYoYi5vbkFkVGltZSliLm9uQWRUaW1lKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkVGltZSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKSk7aWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLllmJiYhdGhpcy5oYSgpJiYodGhpcy5iYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMub2MuaW5kZXhPZihhKSYmdGhpcy5vYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/CnRoaXMubSgiZW1wdHkiKTozMDM9PWIuY29kZSYmMDxiLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLm0oImVtcHR5Iik6KHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm9jLmxlbmd0aD49dGhpcy5zZCYmdGhpcy5vKCkpfSxhczpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLkV1KGEudmlkZW9UYWcpP2EuJGI/dGhpcy5tKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5tY3x8dGhpcy5pc1BsYXlpbmc/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDUwKTooYS5rZigpLGEubWYoKSl9fSl9KShjKTt2YXIgc2E9Yy5yanx8c2E7KGZ1bmN0aW9uKGMpe2MudGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CmUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuY3EoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2I9W107aWYoMTxhLmxlbmd0aClmb3IoZz0wO2c8YS5sZW5ndGg7ZysrKWIucHVzaChhW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBiLnB1c2goandwbGF5ZXIoKS5pZCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGc9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXSksCmQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtkfHwoZD1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7ZHx8Ik9CSkVDVCIhPWcubm9kZU5hbWUmJiJWSURFTyIhPWcubm9kZU5hbWV8fChkPWcpO2lmKGQpe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSChnKXx8dGhpcy5ycihnKXx8KHRoaXMuSihnKSxnPW5ldyBzYShnLHRoaXMuQSksZy5OKCksZy5iKCkpfWVsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSxJdzpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxjcTpmdW5jdGlvbigpe3ZhciBiPWUuTWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUueWIoYi5hbmNob3IpfX0pfSkoYyk7dmFyIHRhPWMudGp8fHRhLHVhPW5ldyB0YShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuY3M9dGhpcy5hWzZdO3RoaXMuQmw9dGhpcy5hWzZdO3RoaXMuSGs9dGhpcy5hWzJdO3RoaXMuWGg9dGhpcy5hWzddO3RoaXMudnE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ubT1iO2IucHJvdG90eXBlPXticzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3M6dGhpcy5BbChhKX0sQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJsOnRoaXMuR2soYSl9LEdrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Iazp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGg6dGhpcy51cShhKX0sdXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnZxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgdmE9Yy5ubXx8dmEsT2M9bmV3IHZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PU9jLmJzKDQpOyhmdW5jdGlvbihjKXtjLnVtPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuUChiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5TKGIpOnRoaXMuSSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5pc1BsYXlpbmcoKX0sTDpmdW5jdGlvbigpe3JldHVybiJYT1pDT00ifX0pfSkoYyk7CnZhciB3YT1jLnVtfHx3YTsoZnVuY3Rpb24oYyl7Yy50bT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciB4YT1jLnRtfHx4YTsoZnVuY3Rpb24oYyl7Yy52bT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuY29tJiZ3aW5kb3cuY29tLnhveiYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXImJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyLmluc3RhbmNlcyYmCjA8ZS5FYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgd2EoZyksdGhpcy5IKGcpfHwodGhpcy5KKGcpLChuZXcgeGEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgeWE9Yy52bXx8eWEsemE9bmV3IHlhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxpPXRoaXMuYVs0XTt0aGlzLnhoPXRoaXMuYVs2XTt0aGlzLnJzPXRoaXMuYVs1XTt0aGlzLmh0PXRoaXMuYVs1XTt0aGlzLmp0PXRoaXMuYVs0XTt0aGlzLmx0PXRoaXMuYVszXTt0aGlzLlpnPXRoaXMuYVsyXTsKdGhpcy5IcD10aGlzLmFbMl07dGhpcy54cD10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLmNyPWI7Yi5wcm90b3R5cGU9e2tpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5saTp0aGlzLndoKGEpfSx3aDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGg6dGhpcy5xcyhhKX0scXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJzOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5odDp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmp0OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubHQ6dGhpcy5ZZyhhKX0sWWc6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlpnOnRoaXMuR3AoYSl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IcDp0aGlzLndwKGEpfSx3cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueHA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuZzphfX19KShjKTt2YXIgQWE9Yy5jcnx8QWEsUGM9bmV3IEFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UGMua2koNCk7KGZ1bmN0aW9uKGMpe2MuZ209cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuUChhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5TKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSwKcmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuSyYmdGhpcy5LKCl9LFFjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGcpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LGtiOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8KITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEJhPWMuZ218fEJhOyhmdW5jdGlvbihjKXtjLmZtPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMuaWE9dGhpcy5YYj10aGlzLldhPXRoaXMuc2M9ITE7dGhpcy5qZz1lLmxiKDEwKTt0aGlzLklnPSEwO3RoaXMud2Q9dGhpcy5HZj0hMTt0aGlzLiRmKCk7dGhpcy5GbygpO3RoaXMuSGEoKX0sV3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmZiKCksIjsiLCJ3aW5kb3cuaW1hOiIsCiI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsdHlwZW9mIGIuYmEsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGIuYmE/Yi5iYS5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuYmE/dHlwZW9mIGIuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5GLCI7Iix0eXBlb2YgYi5GLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuRj9iLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS50YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYudGE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi50YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEudGE/Yi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS50YT90eXBlb2YgYi5pbWEudGEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5GJiZiLkYudGE/Yi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IixiLkYmJmIuRi50YT90eXBlb2YgYi5GLnRhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9kOgoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYub2Q6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5vZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnBkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuRj9iLkYucGQ6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5wZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5GP2IuRi5tYToidW5kZWZpbmVkWCIsIjsiLGIuRj8KdHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEudmQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnZkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYudmQ6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5qZyl9LGdiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYKKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sS2M6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9dGhpcy5nYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubWF9LHVmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuWGIpe3ZhciBiPXRoaXMuZ2IoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5YYn0scHI6ZnVuY3Rpb24oKXtpZighdGhpcy5GZil7dmFyIGI9CnRoaXMuZ2IoKSxhPXRoaXMubnIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLkZmPSEwKX1yZXR1cm4gdGhpcy5GZn0sbnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLnNjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5zYz0hMCk7cmV0dXJuIHRoaXMuc2N9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5LYygpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmCmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuaGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsCmZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LGhlOmZ1bmN0aW9uKCl7dGhpcy53ZD0hMDt2YXIgYj10aGlzLnVmKCk7aWYoYnx8dGhpcy5oYSgpKXt2YXIgYT0iYWRFcnJvciIsZz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOwpiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5YKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5ZYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuTmI9ITA7ZS5qYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrCmQrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2UuamIoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImltcHJlc3Npb24iLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhbGxBZHNDb21wbGV0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5OYnx8KHRoaXMubCgiYWRlcnJvciIsIm5vYWRldmVudCIpLAp0aGlzLlgoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxIdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuJGUmJmIuYWRzJiYodGhpcy4kZT1iLmFkcyk7cmV0dXJuIHRoaXMuJGV9LEZvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5YKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuWCgpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlgoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKTt0aGlzLldkKCl9LmJpbmQodGhpcykpfSxjZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWYoKTtiJiZiLmRlc3Ryb3k/Yi5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmNmKCl9LmJpbmQodGhpcyksNTApfSwkZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7aWYoYi5pc1BsYXlpbmcoKSYmMDxiLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5wcigpKXt2YXIgYT10aGlzLmdiKCksZz10aGlzLktjKCk7YSYmZyYmKHRoaXMuZ2IoKSx0aGlzLktjKCksdGhpcy53ZHx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndkP3RoaXMubSgpOih0aGlzLlgoITApLHRoaXMubCgibm9BZHNNYW5hZ2VyIiwKImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5nYigpfWVsc2UgdGhpcy5HZj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2IoKSxiPXRoaXMuS2MoKTthJiYhYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLlgoKSk6KHRoaXMuWCghMCksdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuR2Y9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihnPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gZ31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBnPWIuZ2V0RXJyb3IoKTtpZihnLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGcuZ2V0RXJyb3JDb2RlJiZhKGcuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxHbzpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5hZHMpe2lmKHRoaXMuUWIhPWIuYWRzLnN0YXRlJiYodGhpcy5RYj1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5RYil7dGhpcy5tKCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLlFiPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbygpfS5iaW5kKHRoaXMpLDEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwO3RoaXMubSgiZW1wdHkgdmFzdCIpfSxYOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLklnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLklnLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSwKTG86ZnVuY3Rpb24oKXt0aGlzLlJ3fHwoMTA8dGhpcy5Fdj8odGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5YLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuRXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5KdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYhdGhpcy5Gdil7dGhpcy5Gdj0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiKwphLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlguYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQ2E9Yy5mbXx8Q2E7KGZ1bmN0aW9uKGMpe2MuaG09ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLnZnKHdpbmRvdyk7Zm9yKHZhciBnPTA7ZzxiLmxlbmd0aDtnKyspdHJ5e2E9YXx8dGhpcy52ZyhiW2ddKX1jYXRjaChkKXt9dGhpcy5JKCl9fSx2ZzpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzP2E9Yi52aWRlb2pzLmdldFBsYXllcnMoKTpiLnZpZGVvanMmJmIudmlkZW9qcy5wbGF5ZXJzJiYoYT1iLnZpZGVvanMucGxheWVycyk7aWYoMDxlLkVhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IEJhKGJbZ10pLGEuamF8fHRoaXMuSChhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5KKGEpLChuZXcgQ2EoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSTpmdW5jdGlvbigpe3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5jYyl9fSl9KShjKTsKdmFyIERhPWMuaG18fERhLEVhPW5ldyBEYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5KcD10aGlzLmFbNF07dGhpcy5VbD10aGlzLmFbNV07dGhpcy5Kaj10aGlzLmFbMTBdO3RoaXMuVmg9dGhpcy5hWzNdO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuV249dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVszXTt0aGlzLnhpPXRoaXMuYVs4XTt0aGlzLmlyPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzFdfWMuWXM9YjtiLnByb3RvdHlwZT17SXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkpwOnRoaXMuVGwoYSl9LFRsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5VbDp0aGlzLklqKGEpfSxJajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuSmo6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZoOnRoaXMuc3MoYSl9LHNzOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMudHM6dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlduOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Dbzp0aGlzLndpKGEpfSx3aTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueGk6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmlyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgRmE9Yy5Zc3x8RmEsUWM9bmV3IEZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuSXAoNCk7KGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuUChhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5TKGEpfSxlYTpmdW5jdGlvbigpe30scmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSyYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLksoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxYYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEdhPWMueWx8fEdhOyhmdW5jdGlvbihjKXtjLnhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkFiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdjPSExO3RoaXMua2coKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZ2M9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy53YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlhlKCk6dGhpcy5tKCl9LHdjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5nYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZ2M/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy53Yy5iaW5kKHRoaXMpLAoxMDApfX0sWGU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5BYiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkFiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuQWIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuQWImJih0aGlzLkFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlhlLmJpbmQodGhpcyksNTApfX0sa2c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5nYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEhhPWMueGx8fEhhOyhmdW5jdGlvbihjKXtjLnpsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBHYSh2aWRlbyk7dGhpcy5IKGIpfHwodGhpcy5KKGIpLChuZXcgSGEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIElhPWMuemx8fElhLEphPW5ldyBJYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Nbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs1XX1jLlZvPQpiO2IucHJvdG90eXBlPXtMbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk1uOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuZzphfX19KShjKTt2YXIgS2E9Yy5Wb3x8S2EsUmM9bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuTG4oNCk7KGZ1bmN0aW9uKGMpe2MuSWg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5aZj1hfSxOOmZ1bmN0aW9uKCl7fSxRZDpmdW5jdGlvbihiKXt0aGlzLlpmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlpmKS5wYXJlbnROb2RlO3RoaXMuUChiKTt0aGlzLlMoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgTGE9Yy5JaHx8TGE7KGZ1bmN0aW9uKGMpe2MuSGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxRZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIE1hPWMuSGh8fE1hOyhmdW5jdGlvbihjKXtjLkpoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IExhKGQsYSksdGhpcy5IKGQpfHwoZC5RZChhKSx0aGlzLkooZCksCmQ9bmV3IE1hKGQsdGhpcy5BLGcpLGQuUWQoZyksZC5iKCkpO2Vsc2V7dGhpcy5JKCk7cmV0dXJufX19dGhpcy5JKCl9fSl9KShjKTt2YXIgTmE9Yy5KaHx8TmEsT2E9bmV3IE5hKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Yaj10aGlzLmFbMTBdO3RoaXMuR249dGhpcy5hWzhdO3RoaXMuWmg9dGhpcy5hWzhdO3RoaXMuT3A9dGhpcy5hWzldO3RoaXMuZGg9dGhpcy5hWzZdO3RoaXMueXQ9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy53cz1iO2IucHJvdG90eXBlPXtXajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGo6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkduOnRoaXMuWWgoYSl9LFloOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5aaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuT3A6CnRoaXMuYmgoYSl9LGJoOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5kaDp0aGlzLnh0KGEpfSx4dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBQYT1jLndzfHxQYSxTYz1uZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy5Xaig0KTsoZnVuY3Rpb24oYyl7Yy5iaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5QKGIpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0KIiIsYlthXS5zdHlsZS52aXNpYmlsaXR5PSJoaWRkZW4ifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5sb2FkR2FtZSgpfSxZYTpmdW5jdGlvbigpe3ZhciBiPSExOyQmJiQoImJvZHkuZGV2aWNlX3RhYmxldCIpJiYwPCQoImJvZHkuZGV2aWNlX3RhYmxldCIpLmxlbmd0aCYmKGI9ITApOyQmJiQoImJvZHkuZGV2aWNlX21vYmlsZSIpJiYwPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBRYT1jLmJrfHxRYTsoZnVuY3Rpb24oYyl7Yy5haz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5ZYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLm5jKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLApmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJ0b3VjaHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubmMoKX0uYmluZCh0aGlzKSkpOnRoaXMubmMoKX0sbmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWREYXRhUmVjZWl2ZWQ/Yi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFJhPWMuYWt8fFJhOyhmdW5jdGlvbihjKXtjLmNrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgUWEoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkgoYil8fAoodGhpcy5KKGIpLChuZXcgUmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIFNhPWMuY2t8fFNhLFRhPW5ldyBTYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Fbz10aGlzLmFbNl07dGhpcy5ncj10aGlzLmFbMl07dGhpcy54dT10aGlzLmFbMTBdO3RoaXMuamg9dGhpcy5hWzJdO3RoaXMubHc9dGhpcy5hWzldO3RoaXMuemg9dGhpcy5hWzEwXTt0aGlzLnF3PXRoaXMuYVszXTt0aGlzLkZzPXRoaXMuYVsxXTt0aGlzLkttPXRoaXMuYVs0XTt0aGlzLmR3PXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzldfWMudW89YjtiLnByb3RvdHlwZT17RG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVvOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLnd1KGEpfSx3dTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHU6CnRoaXMuaWgoYSl9LGloOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qaDp0aGlzLmt3KGEpfSxrdzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHc6dGhpcy55aChhKX0seWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpoOnRoaXMucHcoYSl9LHB3OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5xdzp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnM6dGhpcy5KbShhKX0sSm06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkttOnRoaXMuY3coYSl9LGN3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5kdzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFVhPWMudW98fFVhLFRjPW5ldyBVYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLkRvKDQpOwooZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlpkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLlAoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUyhiKTp0aGlzLmRhKCl9LHN0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuaGIsZz10aGlzLmZiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlpiJiYoMDw9Zy5pbmRleE9mKGQpfHxhLllkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwKKHRoaXMuWmQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxrYjpmdW5jdGlvbigpe3RoaXMuWmQrKztpZigxMDx0aGlzLlpkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiYKd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfX0pfSkoYyk7dmFyIFZhPWMuQWt8fFZhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGQpaWYodGhpcy5pYnx8KHRoaXMuaWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5pYisrLDE1PHRoaXMuaWIpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7CmVsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwxMCl9fSwKd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiYKYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLldhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLktwPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLktwPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5zdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFdhPWMuemt8fFdhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVmEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSChhKXx8KHRoaXMuSihhKSwobmV3IFdhKGEsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBYYT1jLkJrfHxYYSxZYT0KbmV3IFhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkxzPXRoaXMuYVs0XTt0aGlzLmtwPXRoaXMuYVszXTt0aGlzLmxoPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzRdfWMucW49YjtiLnByb3RvdHlwZT17S3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkxzOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMua3A6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBaYT1jLnFufHxaYSxVYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1VYy5Lcyg0KTsoZnVuY3Rpb24oYyl7Yy5iaj0KcC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlAoYi5lbGVtZW50KTt0aGlzLlMoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxYYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgJGE9Yy5ianx8JGE7KGZ1bmN0aW9uKGMpe2MuYWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmIuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBhYj1jLmFqfHxhYjsoZnVuY3Rpb24oYyl7Yy5jaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgJGEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IGFiKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgYmI9Yy5janx8YmIsY2I9bmV3IGJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJpPXRoaXMuYVsxMF07dGhpcy5Ccj10aGlzLmFbOF07dGhpcy5abz10aGlzLmFbN107CnRoaXMuU3A9dGhpcy5hWzJdO3RoaXMubGo9dGhpcy5hWzFdO3RoaXMubmg9dGhpcy5hWzVdO3RoaXMuSHM9dGhpcy5hWzRdO3RoaXMuSWk9dGhpcy5hWzEwXTt0aGlzLk1yPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzldfWMuSXE9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJpOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ccjp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm86dGhpcy5ScChhKX0sUnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNwOnRoaXMua2ooYSl9LGtqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sajp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuSGkoYSl9LEhpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5JaToKdGhpcy5McihhKX0sTHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLk1yOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgZGI9Yy5JcXx8ZGIsVmM9bmV3IGRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuQWkoNCk7KGZ1bmN0aW9uKGMpe2Mubmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuc2YoYiwiZWxlbWVudElEIik7dGhpcy5nZz1iLnBvc2l0aW9uaW5nO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2cuc3R5bGUud2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7Zy5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2cuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWluSGVpZ2h0PQpiLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLmdnP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsYSk7dGhpcy5QKGcpO3RoaXMuUyhnKTt0aGlzLkZjPWd9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5GYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRmMpfSxYYTpmdW5jdGlvbigpe3JldHVybiEwfSxLbzpmdW5jdGlvbigpe2UuTGYodGhpcy5GYyk7ZS5NZih0aGlzLkZjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS28oKX0uYmluZCh0aGlzKSw1MCl9LEw6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sTWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpOwp2YXIgZWI9Yy5uanx8ZWI7KGZ1bmN0aW9uKGMpe2MubWo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGZiPWMubWp8fGZiOyhmdW5jdGlvbihjKXtjLm9qPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMueGE9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLmlucmVhZCl7dmFyIGI9ay5pbnJlYWQsYT1lLnNmKGIsImVsZW1lbnRJRCIpO2UuTGYoYSkmJihiPW5ldyBlYihiKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBmYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuc2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMTAwKX1lbHNlIHRoaXMuc2I9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGdiPWMub2p8fGdiLGhiPW5ldyBnYihxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuUHE9dGhpcy5hWzRdO3RoaXMuUHI9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcz1iO2IucHJvdG90eXBlPXtpbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuamw6dGhpcy5PcShhKX0sT3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlBxOnRoaXMuT3IoYSl9LE9yOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Qcjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGliPWMucHN8fGliLFdjPW5ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVdjLmlsKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9CmE7dGhpcy5tZXRob2Q9IkdFVCI7dGhpcy5kYXRhPXt9fWMuaGo9YjtiLnByb3RvdHlwZT17c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0sYnU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSxnbjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmhqfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsZyxkLGMpe3RoaXMuSWE9YTt0aGlzLm9mPXRoaXMuVGc9ITE7dGhpcy5hZz1kO3RoaXMud2c9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuSWE9bmV3IHooYSkpO3ZhciBlPXRoaXMuUGE9bmV3IFhNTEh0dHBSZXF1ZXN0O2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTsKaWYoZCYmND09ZS5yZWFkeVN0YXRlJiYyMDAhPWUuc3RhdHVzJiYyMDEhPWUuc3RhdHVzKWQoZSk7ZWxzZSBpZig0PT1lLnJlYWR5U3RhdGUmJjA9PWUuc3RhdHVzJiZtJiZtLktkKHRoaXMuSWEudXJsKSYmbS5nZCl7dmFyIGg9bmV3IHooYS51cmwpO2guYnUoIlBPU1QiKTtoLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGgsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZyl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bS5nYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe20uZ2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWMmJjQhPWUucmVhZHlTdGF0ZSYmYyhlKX0uYmluZCh0aGlzKX1jLmlqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLklhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9CiIiLGQ7Zm9yKGQgaW4gYilhKz0iJiIrZCsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGJbZF0pO2E9YS5zdWJzdHIoMSl9dGhpcy5vZiYmKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMud2c/dGhpcy5QYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCExKTp0aGlzLlBhLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITApLHRoaXMuVGd8fCh0aGlzLlBhLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy5QYS5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSwidW5kZWZpbmVkIiE9dHlwZW9mIGsmJmsmJmsudnBhaWQmJm0mJm0uUmModGhpcy5JYS51cmwpJiZ0aGlzLlBhLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuUGEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuUGEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5LZCh0aGlzLklhLnVybCk/bS5nZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLktkKHRoaXMuSWEudXJsKSx0aGlzLmFnJiZ0aGlzLmFnKCl9cmV0dXJuIHRoaXMuUGF9fX0pKGMpO3ZhciBqYj1jLmlqfHxqYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnhkPXRoaXMuZWI9bnVsbDt0aGlzLmJwPXRoaXMucGI9dGhpcy5UZj0hMTt0aGlzLnZhPSIiO3RoaXMuT2Y9ITE7dGhpcy5CYT10aGlzLk5jPSIiO3RoaXMuS2Y9dGhpcy5aPXRoaXMuaXNFbmFibGVkPXRoaXMuZWU9ITE7dGhpcy5PYT1bXTt0aGlzLkNmPXRoaXMuRmI9IiI7dGhpcy5CZD0hMTt0aGlzLnJlPTA7dGhpcy5GZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLkRlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy51Yj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuamM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuRWU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMucWI9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMuc2U9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5IZD0hMTt0aGlzLk1vPXRoaXMuaGQ9bnVsbDt0aGlzLmxlPXRoaXMuaGM9dGhpcy5KZz10aGlzLnVlPXRoaXMuZ2Q9dGhpcy55ZD10aGlzLmxjPSExO3RoaXMuUmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuamo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMub2EsYWR0YWdwYXJhbWV0ZXI6dGhpcy5PYixhZHRhZ21vZGlmaWVyOnRoaXMuZWIsYWR0YWdyZWdleDp0aGlzLnhkLGpzcG9wdXBzOnRoaXMuVGYsc2lkZWxvYWRzOnRoaXMucGIsZGlzYWJsZXRlc3RzOnRoaXMuYnAsaG9tYWRBbGlhczp0aGlzLnZhLAppc0luaXRpYWxpemVkOnRoaXMuT2YsZ2xvYmFsQ29uZmlnOnRoaXMuTmMsY2xpZW50Q29uZmlnOnRoaXMuQmEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5aLGlzQmxvY2tlZDp0aGlzLktmLHNlcnZlcjp0aGlzLk9hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMuQ2YsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy5CZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5yZSxIT01BRF9WRVJJRklFRDp0aGlzLkZlLEhPTUFEX0JMT0NLRUQ6dGhpcy5EZSxIT01BRF9OT0JMT0NLRVI6dGhpcy51YixIT01BRF9BREJMT0NLRVI6dGhpcy5qYyxIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuRWUsdGVzdEhpZGU6dGhpcy5IYix0ZXN0VGFnczp0aGlzLnFiLHRlc3RUYWdzSlM6dGhpcy5JYix0ZXN0Q29va2llOnRoaXMuR2IsdGhyb3R0bGU6dGhpcy5zZSx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLkhkLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMuTW8sCmFkQmxvY2tlckRldGVjdGVkOnRoaXMubGMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnlkLHVzZVN0cmljdENoZWNrczp0aGlzLmdkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLnVlLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUmEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMub2csZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuaGMsc2tpcEFsbG93ZWQ6dGhpcy5sZX19LEVxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLlJhKSJib29sZWFuIj09dHlwZW9mIHRoaXMuUmFbYl0mJjE9PXRoaXMuUmFbYl0mJihhPSEwKTtyZXR1cm4gYX0saWU6ZnVuY3Rpb24oYSl7dGhpcy5SYVthXT0hMH0sZXE6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuUmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5SYVtiXSYmMT09dGhpcy5SYVtiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxvZTpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT0KdHlwZW9mIGEpcmV0dXJuIGE7YT1hLnJlcGxhY2UoIlt0aW1lXSIsTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xRTMpKTthPWEucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTthPWEucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoMTApLnRvU3RyaW5nKCkpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5tbyhhKX0sS2E6ZnVuY3Rpb24oYSxiLGQpe3ZhciBjPSIiLGU9IiIsaD0iIixrPSIiO2lmKCF0aGlzLm9hJiYhYilyZXR1cm4gbmV3IHooYSk7Yz10aGlzLlJjKGEpO2U9dGhpcy5NYShhKTtjPyh0aGlzLmFjKCk/aD1hOmg9ZS5wcm90b2NvbCsiOi8vIitlLmF1dGhvcml0eSsiLyIsaz1lLnBhdGguc3Vic3RyKDEpKTooaD0KdGhpcy5nZSgpLGs9ZS5wYXRoLnN1YnN0cigxKSsoZS5xdWVyeT8iPyIrZS5xdWVyeToiIikpO2QmJih0aGlzLk9ifHx0aGlzLmVifHx0aGlzLnhkKSYmKGs9dGhpcy5vcyhrKSk7YT1uZXcgeihoKTthLnVybD1oO2g9IiI7aD1jP2UuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLmdxKGUuaG9zdCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9aDthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1rO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnliKGspO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sUmM6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLmFjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLAoiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LGFjOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLk9hJiZ0aGlzLk9hLmxlbmd0aCYmMDx0aGlzLk9hLmxlbmd0aCYmKGI9dGhpcy5PYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxLZDpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPVJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPy4qIiwiZyIpLmV4ZWMoYSk7ZCYmKGRbMl18fGRbNV0pP2I9ITA6Yj10aGlzLlJjKGEpO3JldHVybiBifSxncTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSIiO2lmKCJzdHJpbmciPT09dHlwZW9mIHRoaXMudmEmJjA8dGhpcy52YS5sZW5ndGgpcmV0dXJuIHRoaXMudmE7Zm9yKGQgaW4gdGhpcy52YSlpZihiPXRoaXMudmFbZF0sCmIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuenc7cmV0dXJuIm5vbmUifSxQYzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk9hW3RoaXMub2ddfSxnZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUGMoKSxiPXRoaXMuc2coKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sb3M6ZnVuY3Rpb24oYSl7dGhpcy5PYiYmKGErPXRoaXMuT2IpO2lmKHRoaXMuZWIpZm9yKHZhciBiIGluIHRoaXMuZWIpdGhpcy5lYi5oYXNPd25Qcm9wZXJ0eShiKSYmKGE9YS5yZXBsYWNlKGIsdGhpcy5lYltiXSkpO3JldHVybiBhfSxjOmZ1bmN0aW9uKGEsYixkLGMsZSxoKXttPXRoaXM7dGhpcy5PZj0hMDt0aGlzLk5jPWE7dGhpcy5CYT1iO3RoaXMuZWU9ZDt0aGlzLmhkPWM7dGhpcy5EYz1lO3RoaXMuRWI9Cmh8fHt9O3RoaXMuWHIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuQmEpdGhpcy5WcigpO2Vsc2UgdHJ5e3RoaXMuQmE9YigpLHRoaXMueWMoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWmE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFhyOmZ1bmN0aW9uKCl7dGhpcy5HYShuZXcgeih0aGlzLk5jK3RoaXMucWMoImdsb2JhbCIpKSx0aGlzLnRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMueWMoKX0uYmluZCh0aGlzKSwhMCl9LFZyOmZ1bmN0aW9uKCl7bmV3IHoodGhpcy5CYSt0aGlzLnFjKCJjbGllbnQiKSk7dGhpcy5HYShuZXcgeih0aGlzLkJhK3RoaXMucWMoImNsaWVudCIpKSx0aGlzLnljLmJpbmQodGhpcyksCmZ1bmN0aW9uKCl7dGhpcy5pZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0scWM6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMubGIoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnlkKXt0aGlzLnlkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChnKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpOwpmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9O3RoaXMuRGMmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5EYz90aGlzLkRjKCk6KGIoKSx3aW5kb3cuc2V0SW50ZXJ2YWwoYiw1MDApKTt0aGlzLlo9dGhpcy5LZj0KITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMuRGUpKTt0aGlzLnRiKCk7ZS5UYihsLm10KTsoYj1lLnlmKHRoaXMuUGMoKSkpfHwoYj1lLnlmKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7ZS50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx0cTpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5aPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMuQmF8fHRoaXMuRmJ8fHRoaXMudmF8fHRoaXMueWMoKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfX0seWM6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuQmF9ZWxzZSBhPXRoaXMuQmE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWj0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5PYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy52YT1hLmFsaWFzfHxudWxsO3RoaXMuQ2Y9YS5hZHBhdGh8fCIiO3RoaXMuQmQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5vZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5PYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLkZiJiZ0aGlzLnZhJiZ0aGlzLk9hLmxlbmd0aD90aGlzLlRjKCExKToodGhpcy5vYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlo9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLlphKHRoaXMudWIpKSx0aGlzLnRiKCkpfSxUYzpmdW5jdGlvbihhKXtpZighdGhpcy5aKXt2YXIgYj17fTtpZihhKXt2YXIgYj0KbmV3IHoodGhpcy5nZSgpKSxjPXRoaXMuTWEodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMucWMoImN1c3RvbWVyIikpO3RoaXMuR2EoYix0aGlzLkh1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmllKCJjdXN0b21lciIpO2E/dGhpcy5mbD90aGlzLmdhKCJub1NWTUNvbmZpZyIpOih0aGlzLmZsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5UYyghMCl9LmJpbmQodGhpcyksITApfX0sSHU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWil7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe310aGlzLmdkPQp0aGlzLkpiKGIuc3RyaWN0KTt0aGlzLnVlPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuSmc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnFiPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuZWI9Yi5hZHRhZ21vZGlmaWVyfHxudWxsO3RoaXMueGQ9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuVGY9Yi5qc3BvcHVwc3x8ITE7dGhpcy5wYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYz1iLnZwYWlkfHwhMTt0aGlzLkViLnZwYWlkPXRoaXMuaGM7dGhpcy5sZT1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLkdiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mCkFycmF5P3RoaXMub3EoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLkJkJiYodGhpcy5HYj1udWxsKTt0aGlzLnNlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuSGQmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkhkPSEwLHRoaXMuVGMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuZHYoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMucWJ8fHRoaXMuR2IpP3RoaXMuZWU/KHRoaXMub2E9dGhpcy5aPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSksdGhpcy56ZCgpLHRoaXMudGIoKSk6dGhpcy5TdSgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlR1KCkpfX0sU3U6ZnVuY3Rpb24oKXt0aGlzLlJ1KCl9LFR1OmZ1bmN0aW9uKCl7dGhpcy5aPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnViKSk7dGhpcy50YigpfSxmZDpmdW5jdGlvbihhKXt0aGlzLmxjPQohMDt0aGlzLlp8fCh0aGlzLlo9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMudGIoKSx0aGlzLnpkKCkpfSxSdTpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemcoKX1lbHNlIHRoaXMuemcoKX0seWc6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMubGIoKSk7dGhpcy5XdShmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmZkKHRoaXMuamMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnFiPW51bGwsdGhpcy5wZSgpfSxXdTpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5HYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmxiKCkpO3RoaXMuWHUoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnlnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5mZCh0aGlzLmpjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnlnKCl9LFh1OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0scGU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLnJlKyssdGhpcy5HYShuZXcgeih0aGlzLkdiKSx0aGlzLlF1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnFlKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMueGcoKX0scWU6ZnVuY3Rpb24oYSl7dGhpcy5mZCh0aGlzLkVlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sUXU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMucmU/dGhpcy5wZSgpOnRoaXMucWUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy54ZygpOnRoaXMucWUoIkFBQSIpfSx4ZzpmdW5jdGlvbigpe3RoaXMuWj0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy51YikpO3RoaXMudGIoKTt0aGlzLnpkKCl9LHRiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO3RyeXtlLllhKCkmJihhPSIxIil9Y2F0Y2goYyl7YT0yfXRoaXMubGMmJihiPSIxIik7ZS50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLkZlKSk7dGhpcy5oZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhkJiZ0aGlzLmhkKCl9LEpvOmZ1bmN0aW9uKCl7aWYodGhpcy51ZSYmdGhpcy5FcSgpKXt2YXIgYT10aGlzLmVxKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxDZzpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT0KYS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxHYTpmdW5jdGlvbihhLGIsYyxmLGgsSWMpe2E9bmV3IGpiKGEsYixjKTtmJiYoYS5UZz0hMCk7aCYmZS5zcigpJiYoYS5vZj0hMCk7SWMmJihhLndnPSEwKTtyZXR1cm4gYS5sb2FkKCl9LFZlOmZ1bmN0aW9uKCl7ZS5ZYSgpfHxlLkxhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXt0aGlzLmdhKCJtZWRpYWZpbGVfbm94bWwiKTsKcmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtmPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuYWMoKXx8KGE9dGhpcy5NYShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PWguTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuZ2EoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtoLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtoLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpOwplbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxJbzpmdW5jdGlvbigpe3RoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuS2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuR2EoYSx0aGlzLnh2LmJpbmQodGhpcyksdGhpcy53di5iaW5kKHRoaXMpKX0seHY6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwKInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChmKXtyZXR1cm59Y3x8dGhpcy5EcCgpfSx3djpmdW5jdGlvbigpe30sRHA6ZnVuY3Rpb24oKXtlLlRiKGwuQ3ApO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHpkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMucGIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5wYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLnBiW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLkxhKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgYz1uZXcgUTt3aW5kb3dbYy5ZYigpXT10aGlzO2UuTGEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sCnRoaXMpfX19LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuc2V9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxsYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seWI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZixlLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksZT1hLmNoYXJDb2RlQXQobSsrKSwKaD1jPj4yLGM9KGMmMyk8PDR8Zj4+NCxrPShmJjE1KTw8MnxlPj42LGw9ZSY2Myxpc05hTihmKT9rPWw9NjQ6aXNOYU4oZSkmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LE1hOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGY9MTQ7Zi0tOyljW2JbZl1dPWFbZl18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LHNnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixlLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGY9MDtmPG4tMztmKz00KWU9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMykseS5wdXNoKGUpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGYpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspaFtmXT15W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWhbZl09YyhoW2YtM11eaFtmLThdXmhbZi0xNF1eaFtmLTE2XSwxKTtlPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihmPTA7MTk+PWY7ZisrKXg9YyhlLDUpKyhuJnB8fm4mdykrdCtoW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsZT14O2ZvcihmPTIwOzM5Pj1mO2YrKyl4PWMoZSw1KSsobl5wXncpK3QraFtmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1lLGU9eDtmb3IoZj00MDs1OT49ZjtmKyspeD1jKGUsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZSxlPXg7Zm9yKGY9NjA7Nzk+PWY7ZisrKXg9YyhlLDUpKyhuXnBedykrdCtoW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWUsCmU9eDtrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGtiPWMuamp8fGtiLG09bmV3IGtiO3dpbmRvdy5Fdz1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLml3PXRoaXMuYVs4XTt0aGlzLllpPXRoaXMuYVs0XTt0aGlzLkVoPXRoaXMuYVs0XTt0aGlzLkZrPXRoaXMuYVs5XTt0aGlzLmJ3PXRoaXMuYVs1XTt0aGlzLk9sPXRoaXMuYVs4XTt0aGlzLnVuPXRoaXMuYVs2XTt0aGlzLmVrPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuQ2w9YjtiLnByb3RvdHlwZT17aHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLml3OnRoaXMuWGkoYSl9LFhpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllpOnRoaXMuRGgoYSl9LERoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5FaDp0aGlzLkVrKGEpfSxFazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRms6dGhpcy5hdyhhKX0sYXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmJ3OnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5PbDp0aGlzLnRuKGEpfSx0bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudW46dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgbGI9Yy5DbHx8bGIsWGM9bmV3IGxiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuaHcoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApiLGMpe3RoaXMuaj1hO2EudS5MP3RoaXMuTmE9YS51LkwoKTp0aGlzLk5hPSIiO3RoaXMuY29udGFpbmVyPXRoaXMuai5TYTt0aGlzLnBsYXllcj10aGlzLmoudTt0aGlzLnRjPSExO3RoaXMua289MUUzO3RoaXMuY2E9bnVsbDt0aGlzLlQ9Yjt0aGlzLnJhPXt9O3RoaXMudmlkZW89e307dGhpcy5lZD17fTt0aGlzLnJjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMucmM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5qLnUpJiZ0aGlzLmoudS5CJiYoYT10aGlzLmoudS5CKCkpLHRoaXMucmM9Yy5hZG1lc3NhZ2UoYSkpKTtjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubW49Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5kZD0hMTt0aGlzLldmPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToKMTU7dGhpcy5zPXt9O3RoaXMucGM9ITE7dGhpcy5GZz0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLlpiPSExO3RoaXMuVG89ZS5wYSgxMCk7dGhpcy5XYz1lLnBhKDEwKTt0aGlzLlVkPWUucGEoMTApO3RoaXMudGc9ZS5wYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuUmI9dGhpcy5CYj0hMTt0aGlzLkNkPW51bGw7dGhpcy5DYz10aGlzLnVnPXRoaXMuY2c9dGhpcy5HYz10aGlzLmZ2PXRoaXMuYWI9ITF9Yy5kaj1iO2IucHJvdG90eXBlPXtwZzpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdWE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLk5hXSYmdGhpcy5jb25mW3RoaXMuTmFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5OYV1bYV0pO3JldHVybiBifSxEZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5GYSYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmxjP2UudHJhY2soImFkY2FsbCIsIjEiKTplLnRyYWNrKCJhZGNhbGwiLAoiMCIpO2UudHJhY2soInN0YXRzX2hkX2FkX2NhbGwiLCIiLCEwKTtlLkQobC5abSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpfSxPZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYj1jO2lmKHRoaXMuVC5aKXRoaXMuVC5KbygpLHRoaXMuVC5vYSYmdGhpcy5ULmlzRW5hYmxlZD8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsZW1wdHk6InJlc3BvbnNlLmVtcHR5Ij09YSx2cGFpZDp0aGlzLlQuaGN9KSk6Yj8odGhpcy5EZygpLG5ldyBUKHRoaXMsYSx0aGlzLldmLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5ULmhjLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5zYSgpO2Vsc2V7dmFyIGY9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5PZChhLGIsYyl9LDUwKX19LCRkOmZ1bmN0aW9uKGEpe3RoaXMuR2M9ITE7dGhpcy5zPWE7dGhpcy5qdSh0aGlzLnMpO3RoaXMuemYoYSl9LAp6ZjpmdW5jdGlvbihhKXthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSxhLnBhcmVudCYmYS5wYXJlbnQgaW5zdGFuY2VvZiBiJiYodGhpcy5lZD10aGlzLnFxKGEpKSx0aGlzLnpmKGEucGFyZW50KSl9LHFxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5ZKXtiPWEuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuWS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKTthLlkuZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWEuWS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8Zi5sZW5ndGg7aysrKWZba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGZba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJhZElEIiksCmUucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5VYShiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuRWMmJmEuRWMuZXJyb3ImJmEuRWMuZXJyb3IuY29kZSYmKGI9YS5FYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmljLmNvZGU6Yj09Qy5tZC5jb2RlP2UuRChsLk92LHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk6KGUuUGQoKSxiPT1DLkllLmNvZGUmJmUuRChsLnlzLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpO2UuRChsLkJwLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7Yz0ic3RhdHNfaGRfYWRfZW1wdHkiO2JyZWFrO2Nhc2UgeC5HZS5jb2RlOmUuRChsLnl2LAp0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguSmUuY29kZTplLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtlLkQobC5Wdix0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4Lm5kLmNvZGU6ZS5EKGwuJHYsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmxkLmNvZGU6ZS5EKGwuenMsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSxlLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGUudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsIjEwNSIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWFub2ZsYXNoIil9InN0YXRzX2hkX2FkX2Vycm9yIj09CmMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7ZS50cmFjayhjLCIiLCEwKTt0aGlzLnpiKGEpO3RoaXMuc2EoKX0semI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLkFhLmxlbmd0aDspdHJ5e3ZhciBjPWEuQWEucG9wKCk7dGhpcy5OZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZil7fX0sanU6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuWHc9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLm1uJiZ0aGlzLnBsYXllci5KYygpJiYoYi52b2x1bWU9CnRoaXMucGxheWVyLkpjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuaG4oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLkJnKGIpPyh0aGlzLmtuKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5PbygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOgphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLmh1KCkpOnRoaXMuSmQoKT90aGlzLnJnKCk6dGhpcy5zLm9yaWdpbi5oZih4LmxkKX0saHU6ZnVuY3Rpb24oKXtlLlplKCk7dGhpcy5zJiZ0aGlzLnMub3JpZ2luJiZ0aGlzLnMub3JpZ2luLkFlJiZlLmxuKHRoaXMucy5vcmlnaW4uQWUpO2UuJGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmouQzt0aGlzLmouQz1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5qLkMsYSk7dGhpcy5qLmRnKCk7dGhpcy5qLmVjKCk7Zm9yKGE9dGhpcy5qLkc7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuai5lYygpO3RoaXMuVz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLlcuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTsKdGhpcy5XLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsIm5vIik7dGhpcy5XLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJhdXRvcGxheSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuVy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmouRy5hcHBlbmRDaGlsZCh0aGlzLlcpO3RoaXMuVy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnMuc3EoKSxiPXRoaXMucy5PLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGM9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobS5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6YS51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6YS5kZXNpcmVkQml0cmF0ZXx8YS5iaXRyYXRlfHw0MDAsYWRQYXJhbWV0ZXJzOmIsY3JlYXRpdmVEYXRhOntBZFBhcmFtZXRlcnM6Yn0sCmNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5qLkcuc3R5bGUuaGVpZ2h0KX19fTtlLnphKHRoaXMuVywiY29uZmlnIixjKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuemEodGhpcy5XLCJjb25maWciLGMpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwxRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsCiJjb25maWciLGMpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLnphKHRoaXMuVywiY29uZmlnIixjKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS56YSh0aGlzLlcsImNvbmZpZyIsYyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUueG8oImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLlQpO3RoaXMuVy5zcmM9YTtlLnVkKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS5uYW1lJiYoIkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5zYSgpLCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmdGhpcy5KdigpLCJBZFN0YXJ0ZWQiPT0KYS5kYXRhLm5hbWUmJnRoaXMuS3YoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuUWcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5QZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk52KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLk12KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkx2KCkpfS5iaW5kKHRoaXMpKTtlLnVkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLnNhKCl9LmJpbmQodGhpcykpO2UudWQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5zYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmouZW4oZnVuY3Rpb24oYSl7ZS56YSh0aGlzLlcsInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSwKS3Y6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKX0sSnY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7ZS4kYSgiaW1wcmVzc2lvbiIpfSxRZzpmdW5jdGlvbigpe3RoaXMudHJhY2soInN0YXJ0Iik7ZS4kYSgic3RhcnQiKX0sUGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIik7ZS4kYSgiZmlyc3RRdWFydGlsZSIpfSxOdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLiRhKCJ0aGlyZFF1YXJ0aWxlIil9LE12OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLiRhKCJjb21wbGV0ZSIpfSxMdjpmdW5jdGlvbigpe2UuJGEoImFkc3RvcHBlZCIpO3RoaXMuc2EoKX0saG46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5UO2Uub2EmJmUuaXNFbmFibGVkJiYhZS5hYygpPyhmPWUuTWEoZiksYj1mLnByb3RvY29sKwoiOi8vIitmLmhvc3QpOmI9ZjtjLnNyYz1iLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7Yy5vbmVycm9yPXRoaXMuQXYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfSxCZzpmdW5jdGlvbihhKXtyZXR1cm4gMDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGh9LGtuOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLk9nLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sJGM6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuT2cuYmluZCh0aGlzKSk7CmEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMueGUuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnllLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMud2UuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5qZC5iaW5kKHRoaXMpKX0sT2c6ZnVuY3Rpb24oYSl7dGhpcy52aWRlby5jb250cm9scz0hMTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGUoYSl9LmJpbmQodGhpcyksdGhpcy5rbyl9LHhlOmZ1bmN0aW9uKGEpe3RyeXtpZighZS5ZYSgpJiZ0aGlzLlQuSmcmJmEudGFyZ2V0JiY1Pj1hLnRhcmdldC5kdXJhdGlvbiYmNTxNYXRoLmFicyh0aGlzLnMuZHVyYXRpb24tYS50YXJnZXQuZHVyYXRpb24pKXt0aGlzLkJifHwodGhpcy5CYj0hMCx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuVC5nYSgidmlkZW8tbm9vcCIpKTsKcmV0dXJufX1jYXRjaChiKXt9dGhpcy50Y3x8IXRoaXMuQmcodGhpcy52aWRlbyl8fHRoaXMuQmJ8fCh0aGlzLnRjPSEwLHRoaXMuenYoKSx0aGlzLnZpZGVvLmNvbnRyb2xzPSExLHRoaXMuai5lYygpLHRoaXMuTGcoKSx0aGlzLk1nKCksdGhpcy5UZSgpLHRoaXMuai5kZygpLHRoaXMudmlkZW8ucGxheSYmdGhpcy5uZSgpKX0sbmU6ZnVuY3Rpb24oKXtpZighdGhpcy5DYylpZih0aGlzLmNvbmYucHJlQWRJZnJhbWVVcmwpe3ZhciBhPXRoaXMuY29uZi5wcmVBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXt0aGlzLk9jPVtdO2Zvcih2YXIgYj10aGlzLmouRyxjPTA7YzxiLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5PYy5wdXNoKGIuY2hpbGRyZW5bY10pLGIuY2hpbGRyZW5bY10uc3R5bGUuZGlzcGxheT0ibm9uZSI7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKZnVuY3Rpb24oYSl7YS5zdG9wUHJvcGFnYXRpb24oKX0pO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7Yi5hcHBlbmRDaGlsZChjKTt2YXIgZj0obmV3IERhdGUpLmdldFRpbWUoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7aWYoImNvbnRpbnVlIj09YS5kYXRhKXt0aGlzLnJkKCk7YT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7ZS50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lT3BlbmVkIiwKIiIsITApfWVsc2UgdGhpcy5yZCgpfWVsc2UgdGhpcy5yZCgpfSxyZDpmdW5jdGlvbigpe2lmKHRoaXMuT2MpZm9yKHZhciBhPTA7YTx0aGlzLk9jLmxlbmd0aDthKyspdGhpcy5PY1thXS5zdHlsZS5kaXNwbGF5PSJibG9jayI7aWYoKGE9dGhpcy52aWRlby5wbGF5KCkpJiZhWyJjYXRjaCJdKWFbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5zYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwiIiwhMCkpfS5iaW5kKHRoaXMpKTtiYT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5DYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMucGN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLm5lKCkpfS5iaW5kKHRoaXMpOwp0aGlzLnhmKCkucWcodGhpcyl9LHdlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtlLkQobC5VbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMucy54Yj8odGhpcy50Yz0hMSx0aGlzLiRjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuZGQ9ITEsdGhpcy5qLkhnKCksdGhpcy5zLm9yaWdpbi5WZCgpKTp0aGlzLnNhKCl9LEF2OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuJGModGhpcy52aWRlbyksdGhpcy5KZCgpPwp0aGlzLnJnKCk6dGhpcy5qZChhKSl9LGpkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkpkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuVmUoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5WZSgpKTt0aGlzLnMub3JpZ2luLmhmKHgubGQpfSx5ZTpmdW5jdGlvbigpe2lmKHRoaXMuZnYpdGhpcy5zYSgpO2Vsc2V7dGhpcy5aYj0hMDt0aGlzLmoudS5rYiYmIXRoaXMudWcmJnRoaXMuai51LmtiKCkmJmUuRChsLkFjLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLmt2KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5tZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy50Zyk7YyYmKGI9dGhpcy5zLm1lLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5kZHx8KHRoaXMuZGQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5EKGwuJG0sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKTt0aGlzLnMueGI/KHRoaXMudGM9ITEsdGhpcy4kYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmRkPSExLHRoaXMuai5IZygpLHRoaXMucy5vcmlnaW4uVmQoKSk6dGhpcy5zYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5yYy5yZXBsYWNlKCJbdGltZV0iLGUucGYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMucGM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LHJnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5scSgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5lYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuTmcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuTGcoKTt0aGlzLk1nKCk7dGhpcy5DZD1zZXRJbnRlcnZhbCh0aGlzLkhvLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0sbHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZj1iPXRoaXMucy5NW2NdLGU7ZT1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLmFjKCkmJihlPWguTWEoZSksZT1lLnByb3RvY29sKyI6Ly8iK2UuaG9zdCk7Zi51cmw9ZTthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKSG86ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLkNkKSx0aGlzLndlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMueWUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuQ2QpLHRoaXMuamQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSxFZzpmdW5jdGlvbigpe3RoaXMuY2d8fCh0aGlzLmNnPSEwLHRoaXMuR2N8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxrdjpmdW5jdGlvbihhKXthPT10aGlzLkZnfHx0aGlzLkJifHwoMD09YSYmKHRoaXMuYWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuYWIpLHRoaXMuYWI9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLkVnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5FZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5CYnx8ZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGUuWWEoKSYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGUuRChsLldtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSksZS5EKGwuYW4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSx0aGlzLlJiJiZlLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5HYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUuRChsLlZtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLkQobC5ZbSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5EKGwuY24sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSksZS5EKGwuZG4sdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSwKdGhpcy5GZz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5CYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnJxKHRoaXMucy5BYSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBmPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmVkLmltcHJlc3Npb25zJiZlLnFyKGYudXJsLHRoaXMuZWQuaW1wcmVzc2lvbnMpP3RoaXMuTmQoZi51cmwsZi50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UuRChsLlhtLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSx7YWRJZDp0aGlzLmVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5OZChmLnVybCxmLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy5BYT10aGlzLiRvKHRoaXMucy5BYSxhKSl9fSxOZDpmdW5jdGlvbihhLGIsYyxmKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuS2EoYSksYyYmYS5nbihjKSxmfHwoZj10aGlzLmdmKSx0aGlzLlQuR2EoYSxmLHRoaXMuZ2YsITEsITApKX0scnE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSwkbzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSx6djpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5OZy5iaW5kKHRoaXMpfSxOZzpmdW5jdGlvbigpe2UuRChsLk5vLHRoaXMucy5PLHRoaXMuai51LkIoKSx0aGlzLlIoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkdjJiZlLllhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZS5acCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMueGN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnhjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sTGc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucmMucmVwbGFjZSgiW3RpbWVdIixlLnBmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LE1nOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Ubzt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLmJkLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuV2M7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuaHYuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuVmIuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlVkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuZ3YuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuYmQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5WYi5iaW5kKHRoaXMpKTt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLnRvcD0iLTUwcHgiLGYuc3R5bGUucmlnaHQ9IjBweCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMudGc7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtmLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5tZSYmYS5hcHBlbmRDaGlsZChmKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLmJkLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuVmIuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LlhhJiZ0aGlzLmoudS5YYSgpJiZ0aGlzLnVzKCk7dGhpcy5WYigpfX0sVmI6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxiZDpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxodjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuV2MpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLkQobC5PZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sWWQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLldjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5EKGwuT2UsdGhpcy5zLk8sdGhpcy5qLnUuQigpLHRoaXMuUigpKSl9LE10OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5XYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLkQobC5QZSx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpKX0sZ3Y6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlVkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LHVzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LENiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQ2IpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkNiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5DYik7dGhpcy5DY3x8dGhpcy5wY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMubmUoKSl9LHNhOmZ1bmN0aW9uKCl7dGhpcy5DYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1lLkZhJiZ0aGlzLnBjfHwicG9zdHJvbGwiPT1lLkZhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShlLkZhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5lYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5BZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZikvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7ZS50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLkFkKCl9ZWxzZSB0aGlzLkFkKCl9LEFkOmZ1bmN0aW9uKCl7dGhpcy51Zz0hMDt0aGlzLmouQmYoKTsKdGhpcy5qLk50KCk7dGhpcy5aYj0hMTtlLkQobC5Tbyx0aGlzLnMuTyx0aGlzLmoudS5CKCksdGhpcy5SKCkpO3RoaXMueGYoKS5LdCgpfSx4ZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxKZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LFRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy51YSgibWluVmlzIik7YSYmKGUuTWYodGhpcy52aWRlbyxhKT90aGlzLk10KCk6dGhpcy5ZZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy54YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy54Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LGdmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmRqfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs5XTt0aGlzLlN0PXRoaXMuYVsxMF07dGhpcy54cj10aGlzLmFbNV07dGhpcy5QbT10aGlzLmFbNV07dGhpcy4kcz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVszXX1jLlJzPWI7Yi5wcm90b3R5cGU9e1JrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Tazp0aGlzLlJ0KGEpfSxSdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlN0OnRoaXMud3IoYSl9LHdyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54cjp0aGlzLk9tKGEpfSxPbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUG06dGhpcy5acyhhKX0sWnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiRzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgbWI9Yy5Sc3x8bWIsWWM9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuUmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5ZPW51bGw7dGhpcy5NYj0hMTt0aGlzLkFlPSIiO3RoaXMuemU9ITE7ZCYmZC5lbXB0eT90aGlzLiRyKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOgp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLmVtPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLmRmKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMP25ldyB6KHRoaXMudXJsKTptLkthKG0ub2UodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7dGhpcy5vcHRpb25zLnZwYWlkJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW0mJihhPWUuYWYodGhpcy51cmwpLHRoaXMudXJsPSJodHRwczovL2ltYTN2cGFpZC5hcHBzcG90LmNvbS8/YWRUYWdVcmw9IitlbmNvZGVVUklDb21wb25lbnQobS5vZShhKSkrIiZ0eXBlPWpzIixiPW0uS2EobS5vZSh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KImNvbWFwcHNwb3RpbWEzdnBhaWQiKSxiLmRhdGEuaG9tYWRfY29tcGF0aWJsZV92cGFpZD0idHJ1ZSIpO20uR2EoYix0aGlzLlpyLmJpbmQodGhpcyksdGhpcy5Xci5iaW5kKHRoaXMpKX0scWY6ZnVuY3Rpb24oKXt2YXIgYT0wPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkZhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsKIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1nLmZpcnN0Q2hpbGR9Y2F0Y2goZil7Y1tiXT17fX1lbHNlIGMuc3BsaWNlKGIsMSl9KTt2YXIgYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRCcmVhayIpKTswPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5GYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuRmEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysKKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2dbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe31lbHNlIGMuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxacjpmdW5jdGlvbihhKXt0aGlzLkR0KGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5DYSh4Lm5kKSl9dGhpcy5iYT0KdGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LCRyOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkphfHwodGhpcy5KYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQ2EoeC5uZCkpfXRoaXMuYmE9dGhpcy5xZigpO3RoaXMuTWI9dGhpcy5BZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuVWMoKTp0aGlzLmZhKHRoaXMuQ2EoeC5pYyx7ZXJyb3I6dGhpcy56ZT9DLm1kOkMuSGV9KSl9LFdyOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkNhKHguR2Use2RlcHRoOmF9KSl9LFVjOmZ1bmN0aW9uKCl7dGhpcy5ZPXRoaXMuYmEuc2hpZnQoKTt0aGlzLnZyKCk/dGhpcy5ZdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLkFmKCksZyx7QWRTeXN0ZW06dGhpcy5YcCgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5mYSh0aGlzLkNhKHguSmUpKTooYT0wLHRoaXMudXYoKSYmdGhpcy4kZCh0aGlzLlVvKCkpKX0sVmQ6ZnVuY3Rpb24oKXt0aGlzLk1iPyh0aGlzLk1iPTE8dGhpcy5iYS5sZW5ndGgsdGhpcy5iYS5sZW5ndGgmJnRoaXMuVWMoKSk6dGhpcy5wYXJlbnQuVmQoKX0sdXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5WdSgpP3RoaXMuVXUoKT8hMDooLTEhPXRoaXMuVWIoKT90aGlzLmZhKHRoaXMuQ2EoeC5DZSkpOnRoaXMuZmEodGhpcy5DYSh4LmJpKSksITEpOih0aGlzLmZhKHRoaXMuQ2EoeC5pYyxDLkllKSksITEpfSwkZDpmdW5jdGlvbihhKXthLkFhPWEuQWEuY29uY2F0KHRoaXMuUmQoKSk7YS54Yj1hLnhiP2EueGI6dGhpcy5NYjt0aGlzLnBhcmVudC4kZChhKX0sVW86ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbmI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMudmYoKTthLnhjPXRoaXMuJHAoKTthLm9yaWdpbj10aGlzO2EuTz10aGlzLldwKCk7YS5tZT10aGlzLnBxKGEuZHVyYXRpb24pOwpyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oYil7dGhpcy5ZJiYoYi5BYT1iLmVycm9yLmNvZGUhPXguQ2UuY29kZT9iLkFhLmNvbmNhdCh0aGlzLmJxKCkpOmIuQWEuY29uY2F0KHRoaXMuanEoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuemImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC56YiYmdGhpcy5wYXJlbnQuemIoYiksYT0wLHRoaXMuVWMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx6YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC56YihhKX0saGY6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQ2EoYSxiKSl9LENhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG9iKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sWXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxnfSxWdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMudmYoKS5sZW5ndGh9LApVdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0sQWc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sRHQ6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLkFlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy56ZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSx2cjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuQWYoKS5sZW5ndGh9LEFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRWQodGhpcy5ZLCJWQVNUQWRUYWdVUkkiKX0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FZCh0aGlzLlksIkFkU3lzdGVtIil9LFJkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpbIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKGcpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2lmKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxnLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMuVWEoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxqcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxicTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuUmQoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sJHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VYSh0aGlzLlkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCnZmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuWS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksdWM6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLEN3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLlVhKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnVjKS1NYXRoLmFicyg3MDAtYi51Yyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS51YyktTWF0aC5hYnMoNzAwLWIudWMpfSksYj1nLmNvbmNhdChkKX1jYXRjaChlKXt9cmV0dXJuIGJ9LFdwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZz1bXSxiPSExLGQ9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMuTWMoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2UucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuVWEodGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0scHE6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGV8fG0mJm0ubGUpdHJ5e2M9dGhpcy5ZLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxnPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkF1KGcsYSksMD5iJiYoYj0hMSl9Y2F0Y2goZCl7Yj0hMX1yZXR1cm4gYn0sRWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLlVhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxGZDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sVWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5NYyhhKToKIiJ9LE1jOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuRmQoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVD1jLmVtfHxUO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlprPXRoaXMuYVs0XTt0aGlzLmd3PXRoaXMuYVs2XTt0aGlzLkRyPXRoaXMuYVsxMF07dGhpcy5NbD10aGlzLmFbNV07dGhpcy5DdT10aGlzLmFbNl07dGhpcy5Taj10aGlzLmFbN107dGhpcy5xcD10aGlzLmFbNV07dGhpcy5Rcz10aGlzLmFbMTBdO3RoaXMuZz10aGlzLmFbMl19Yy5udj1iO2IucHJvdG90eXBlPXtZazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWms6dGhpcy5mdyhhKX0sZnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmd3OnRoaXMuQ3IoYSl9LENyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLkRyOnRoaXMuTGwoYSl9LExsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5NbDp0aGlzLkJ1KGEpfSxCdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3U6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Tajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlFzOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMubnZ8fHBiLFpjPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVpjLllrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuQWE9W107dGhpcy5NPVtdO3RoaXMueGM9IiI7dGhpcy5PPQp0aGlzLnhiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Laz1iO2IucHJvdG90eXBlPXtPbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxzcTpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIG5iPWMuS2t8fG5iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Wcz10aGlzLmFbOV07dGhpcy56cj10aGlzLmFbM107dGhpcy5lcD10aGlzLmFbMTBdO3RoaXMuRG09dGhpcy5hWzhdO3RoaXMuSnU9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMTBdfWMuams9YjtiLnByb3RvdHlwZT17aXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmp2OnRoaXMuVXMoYSl9LFVzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wczp0aGlzLnlyKGEpfSx5cjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuenI6dGhpcy5jcChhKX0sY3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVwOnRoaXMuQ20oYSl9LApDbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRG06dGhpcy5JdShhKX0sSXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkp1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5qa3x8cWIsJGM9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9JGMuaXYoNCk7dmFyIHg9e25kOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLGthOiJYTUxfUEFSU0VfRVJST1IifSxiaTp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsa2E6IkRVUkFUSU9OX0VSUk9SIn0saWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLAprYToiRU1QVFlfVkFTVCJ9LEplOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLGthOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxHZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIiwKa2E6IkxPQURfRVJST1IifSxsZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsa2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxydzp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixrYToiTUVESUFGSUxFX0VSUk9SIn0sQ2U6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsa2E6IkRVTU1ZX0FEIn19LEM9e0hlOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsa2E6Ik5PX0FEUyJ9LEllOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixrYToiTk9fTUVESUFGSUxFUyJ9LHR3Ont0eXBlOiJlcnJvciIsCmNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixrYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LG1kOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLGthOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm51PXRoaXMuYVsxXTt0aGlzLlhzPXRoaXMuYVs0XTt0aGlzLmhsPXRoaXMuYVsxXTt0aGlzLk9qPXRoaXMuYVsxXTt0aGlzLnRvPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMuQ2g9YjtiLnByb3RvdHlwZT17bXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm51OnRoaXMuV3MoYSl9LFdzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yczp0aGlzLmdsKGEpfSxnbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaGw6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5Pajp0aGlzLnNvKGEpfSxzbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnRvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcmI9Yy5DaHx8cmIsYWQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YWQubXUoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5FYz1iO3RoaXMuQWE9W107dGhpcy5vcmlnaW49bnVsbH1jLkxpPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgb2I9Yy5MaXx8b2I7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuU3I9dGhpcy5hWzEwXTt0aGlzLnNrPXRoaXMuYVs5XTt0aGlzLm1wPXRoaXMuYVs1XTt0aGlzLkVpPQp0aGlzLmFbNF07dGhpcy5kbD10aGlzLmFbNF07dGhpcy5Bbj10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5haD10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkxtPWI7Yi5wcm90b3R5cGU9e1JyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tcjp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnNrOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5tcDp0aGlzLkRpKGEpfSxEaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRWk6dGhpcy5jbChhKX0sY2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmRsOnRoaXMuem4oYSl9LHpuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Bbjp0aGlzLlZ0KGEpfSxWdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuV3Q6dGhpcy4kZyhhKX0sJGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmFoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTG18fHNiLGJkPW5ldyBzYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWJkLlJyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuU2E9YS5yZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9ZS5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuVGE9e307dGhpcy5RZj0hMTt0aGlzLldiPVtdfWMuamk9YjtiLnByb3RvdHlwZT17bnE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMubnEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLm9yKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxHdTpmdW5jdGlvbigpe3RoaXMuUWY9ITB9LEhnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxkZzpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2UuRChsLkFjLHRoaXMudS5CKCkpfSxOdDpmdW5jdGlvbigpe3RoaXMuUWZ8fCh0aGlzLnUucGxheSgpLGUuRChsLkJjLHRoaXMudS5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlNhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5TYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlNhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuU2Eub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5TYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5TYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUucmYoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5EZi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sb3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGFxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sRGY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hcSh0aGlzLlNhKTsKaWYoYi54IT10aGlzLlRhLnh8fGIueSE9dGhpcy5UYS55fHxiLnBvc2l0aW9uIT10aGlzLlRhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlRhLndpZHRofHxiLmhlaWdodCE9dGhpcy5UYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5UYS53aWR0aCYmMDx0aGlzLlRhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuQmYoKTtyZXR1cm59dGhpcy5UYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuV2IubGVuZ3RoO2ErKyl0aGlzLldiW2FdKHt3aWR0aDpiLndpZHRoLApoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLkRmLmJpbmQodGhpcyksMTApfSxlbjpmdW5jdGlvbihhKXt0aGlzLldifHwodGhpcy5XYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuV2IucHVzaChhKX0sQmY6ZnVuY3Rpb24oKXt0aGlzLkcmJnRoaXMuRy5wYXJlbnROb2RlJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5HKTt0aGlzLkMmJnRoaXMuQy5wYXVzZSYmdGhpcy5DLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgTj1jLmppfHxOLEI9W10sdGI9MDsxMDA+dGI7dGIrKyl7dmFyIEw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtMLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtMLmlkPWUucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCkEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRxPXRoaXMuYVs3XTt0aGlzLnZqPXRoaXMuYVs5XTt0aGlzLnpxPXRoaXMuYVs2XTt0aGlzLkVuPXRoaXMuYVsxXTt0aGlzLlVyPXRoaXMuYVs5XTt0aGlzLnduPXRoaXMuYVsxXTt0aGlzLmJ0PXRoaXMuYVsxXTt0aGlzLlR2PXRoaXMuYVs5XTt0aGlzLmlwPXRoaXMuYVs3XTt0aGlzLmdpPXRoaXMuYVsxXTt0aGlzLmc9dGhpcy5hWzZdfWMuT3M9YjtiLnByb3RvdHlwZT17WnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRxOnRoaXMudWooYSl9LHVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52ajp0aGlzLnlxKGEpfSx5cTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuenE6dGhpcy5EbihhKX0sCkRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fbjp0aGlzLlRyKGEpfSxUcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVXI6dGhpcy52bihhKX0sdm46ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnduOnRoaXMuYXQoYSl9LGF0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5idDp0aGlzLlN2KGEpfSxTdjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVHY6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmlwOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5naTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHViPWMuT3N8fHViLGNkPW5ldyB1YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWNkLlpxKDQpOyhmdW5jdGlvbihjKXtjLnVrPQpwLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5QKGEpO3RoaXMua2UoYik7dGhpcy5lZigpfSxrZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sZWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkRhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5TKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZigpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKa2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sUWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkRhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgdmI9Yy51a3x8dmI7KGZ1bmN0aW9uKGMpe2MudGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPWNhKCk7CnRoaXMud2I9dGhpcy53Ynx8ITE7dGhpcy5OZT10aGlzLlFlPXRoaXMuSGY9dGhpcy5pYT10aGlzLnRlPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuTHAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRlPSEwO3RoaXMuSGYmJnRoaXMuWWUoKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5oYjthJiZhLlpiJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudmMoKTsKdGhpcy5IZj0hMDt0aGlzLlllKCl9LmJpbmQodGhpcykpO3RoaXMuVWUoKX0sWWU6ZnVuY3Rpb24oKXtpZighdGhpcy53Yil7dGhpcy52YygpO2lmKCF0aGlzLnRlJiYhdGhpcy52YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMudGUmJnRoaXMuTmUmJiF0aGlzLlFlJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0sdmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLndmKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LHdmOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApVZTpmdW5jdGlvbigpe2lmKHRoaXMudmMoKSl7dmFyIGI9dGhpcy53ZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlFlPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuTmU9Yi55d310aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5VZSgpfS5iaW5kKHRoaXMpLDEwMCl9LEZ3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLlN3KCk6ITF9LFViOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi5VYigpOi0xfSxrcTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxMcDpmdW5jdGlvbihiLGEpe3RoaXMud2I9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMud2J8fDMwMj09dGhpcy53Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy53Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpjKCl9LmJpbmQodGhpcyksMTAwKX0semM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuaWE/KHRoaXMubSgpLHRoaXMubmEoKSk6Yi5RYygpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLmtxKGIpPyh0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHdiPWMudGt8fHdiOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCnRyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLk9rLkltLkdtP3dpbmRvdy5PTy5Pay5JbS5HbS53dyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cigpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO3ZhciBiPWNhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkVhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB2YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgd2IoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyIHhiPWMudmt8fHhiLHliPW5ldyB4YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuQW89dGhpcy5hWzhdO3RoaXMua3I9dGhpcy5hWzhdO3RoaXMuTHU9dGhpcy5hWzNdO3RoaXMuUWs9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy52cz1iO2IucHJvdG90eXBlPXt6bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQW86dGhpcy5qcihhKX0sanI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmtyOnRoaXMuS3UoYSl9LEt1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5MdTp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB6Yj1jLnZzfHx6YixkZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1kZC56byg0KTsoZnVuY3Rpb24oYyl7Yy52bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUyhhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMudmx8fFU7KGZ1bmN0aW9uKGMpe2MudWw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkudGQoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnRkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuSXMoYSl9LmJpbmQodGhpcykpO3kuRHEoKX0sSXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYKKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMubSgpO3RoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgVj1jLnVsfHxWOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLlZjJiYoYj1lLmFwKGIsdGhpcy5WYykpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLAoiIiksZD1uZXcgVShkKTtpZighdGhpcy5IKGQpKXt0aGlzLkooZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkEpO2YuYigpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLlZjfHwodGhpcy5WYz1bXSksdGhpcy5WYy5wdXNoKGJbYV0pLGQ9bmV3IFUoaCksdGhpcy5IKGQpfHwodGhpcy5KKGQpLGY9bmV3IFYoZCx0aGlzLkEpLGYuYigpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sdGQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuYWF8fCh0aGlzLmFhPXt9KTt0aGlzLmFhW2JdfHwodGhpcy5hYVtiXT17fSk7dGhpcy5hYVtiXVthXXx8KHRoaXMuYWFbYl1bYV09W10pO3RoaXMuYWFbYl1bYV0ucHVzaChjKX0sWnU6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5hYXx8CnRoaXMuYWEmJiF0aGlzLmFhW2FdKXRoaXMuYmN8fCh0aGlzLmJjPVtdKSx0aGlzLmJjLnB1c2goYiksdGhpcy5MdCgpJiYodGhpcy5sZygpLHRoaXMuYigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2FdW2NdJiYwPHRoaXMuYWFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5hYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYWFbYV1bY11bZF0oYil9fSxEcTpmdW5jdGlvbigpe2lmKHRoaXMuYmMpZm9yKHZhciBiPTA7Yjx0aGlzLmJjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuYmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmFhW2NdW2RdJiYwPHRoaXMuYWFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5hYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuYWFbY11bZF1bZl0oYSl9fSwKdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5adShiKX19KX0pKGMpO3ZhciBBYj1jLndsfHxBYix5PW5ldyBBYihxKTthYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkdsPXRoaXMuYVsxXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLlFqPXRoaXMuYVsxXTt0aGlzLmptPXRoaXMuYVsyXTt0aGlzLnFsPXRoaXMuYVs1XTt0aGlzLmxzPXRoaXMuYVszXTt0aGlzLmVvPXRoaXMuYVs0XTt0aGlzLnVpPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzEwXX1jLktsPWI7Yi5wcm90b3R5cGU9e0ZsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HbDp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuJGk6CnRoaXMuUGooYSl9LFBqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Rajp0aGlzLmltKGEpfSxpbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuam06dGhpcy5wbChhKX0scGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnFsOnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sczp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZW86dGhpcy50aShhKX0sdGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51aTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBCYj1jLktsfHxCYixlZD1uZXcgQmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5GbCg0KTsoZnVuY3Rpb24oYyl7Yy5NaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPQohMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxrYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sWGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sCkw6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLk1ofHxDYjsoZnVuY3Rpb24oYyl7Yy5OaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2EuaXNBZCYmYS5pc0FkKCk/dGhpcy5tKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwyNTApO3RoaXMucXR8fCh0aGlzLnF0PSEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9NaWRwb2ludCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5OaHx8RGI7KGZ1bmN0aW9uKGMpe2MuT2g9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPW5ldyBDYihkKTt0aGlzLkgoZSl8fCh0aGlzLkooZSksKG5ldyBEYihlLAp0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5JKCl9LEg6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy55YSlpZihhPT10aGlzLnlhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnlhW2IuZmIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5PaHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs2XTt0aGlzLmFpPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzhdfWMubWs9YjtiLnByb3RvdHlwZT17dWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZoOnRoaXMuJGgoYSl9LCRoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5haTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdiPWMubWt8fApHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5sbT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5LPygwLHRoaXMuSykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSw0MDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIEhiPWMubG18fEhiOyhmdW5jdGlvbihjKXtjLmttPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnLm5leHRTaWJsaW5nO3RoaXMuU2V8fHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCl9LmJpbmQodGhpcyksMTAwKTt0aGlzLlZwfHwodGhpcy5JZigpLAp0aGlzLlZwPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLlNlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5TZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpfSxZcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmltYX0sSWY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLllwKCk7Yj9iJiZiLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT8odGhpcy5pYT0hMCx0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLm8oKSx0aGlzLmwoImFkZXJyb3IiLAphLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JZigpfS5iaW5kKHRoaXMpLDUwKX0sUXc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEliPWMua218fEliOyhmdW5jdGlvbihjKXtjLm1tPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMueGE9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKXt2YXIgYz1uZXcgSGIoYi5pdGVtKGEpKTt0aGlzLkgoYyl8fC0xPT1jLmlkLnNlYXJjaCgidmlkZW9fIil8fCh0aGlzLkooYyksKG5ldyBJYihjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTsKdmFyIEpiPWMubW18fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5SaD10aGlzLmFbMV07dGhpcy5ydT10aGlzLmFbNF07dGhpcy5oaD10aGlzLmFbOF07dGhpcy5Tbj10aGlzLmFbNl07dGhpcy5waD10aGlzLmFbNF07dGhpcy5xaz10aGlzLmFbOV07dGhpcy56dT10aGlzLmFbOF07dGhpcy55bj10aGlzLmFbNl07dGhpcy5vdz10aGlzLmFbOF07dGhpcy5lcj10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs0XX1jLk5uPWI7Yi5wcm90b3R5cGU9e1FoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUmg6dGhpcy5xdShhKX0scXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJ1OnRoaXMuZ2goYSl9LGdoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5oaDp0aGlzLlJuKGEpfSxSbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU246dGhpcy5vaChhKX0sCm9oOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5waDp0aGlzLnBrKGEpfSxwazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucWs6dGhpcy55dShhKX0seXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnp1OnRoaXMueG4oYSl9LHhuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bjp0aGlzLm53KGEpfSxudzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub3c6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmVyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgTGI9Yy5Obnx8TGIsZ2Q9bmV3IExiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuUWgoNCk7KGZ1bmN0aW9uKGMpe2MuRGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGF1c2UiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QbGF5Iil9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXIoInBsYXllclBsYXlFbmQiLGZ1bmN0aW9uKCl7dGhpcy5LJiYoMCx0aGlzLkspKCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5bGlzdFBsYXlOZXh0IixmdW5jdGlvbigpe3RoaXMuSyYmKDAsdGhpcy5LKSghMCl9LmJpbmQodGhpcykpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuRGp8fE1iOyhmdW5jdGlvbihjKXtjLkNqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSxsb2c6ZnVuY3Rpb24oKXt9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcj8oYi5hZGRKc0xpc3RlbmVyKCJhZEVycm9yRXZlbnQiLGZ1bmN0aW9uKCl7dGhpcy5SZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiZmlyc3RQbGF5IixmdW5jdGlvbigpe3RoaXMubmYoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm5mKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRTdGFydCIsZnVuY3Rpb24oKXt0aGlzLmJuKCl9LmJpbmQodGhpcykpLHRoaXMuU2c9ITEsdGhpcy5Sdj0xRTMsdGhpcy5mZz17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksCjEwMCl9LG5mOmZ1bmN0aW9uKCl7dGhpcy5mZy5kb25lfHwodGhpcy5mZy5kb25lPSEwLHRoaXMuU2c9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJnKCl9LmJpbmQodGhpcyksdGhpcy5SdikpfSxibjpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5TZyk7dGhpcy5tKCl9LFJnOmZ1bmN0aW9uKCl7dGhpcy53YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLCJBZFN0YXJ0RXZlbnRUaW1lb3V0IiksdGhpcy53KCkpfSx0ZjpmdW5jdGlvbihiKXt2YXIgYT1bXTtpZihiKWZvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBiW2NdKWlmKGJbY10uaGFzT3duUHJvcGVydHkoZCkmJmJbY11bZF0mJmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZj1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7CmEucHVzaChmLmdldEVycm9yQ29kZSgpKX1yZXR1cm4gYX0sd2E6ZnVuY3Rpb24oKXt2YXIgYj1bXTttdyYmbXcuZXJyb3JEZWxlZ2F0ZXM/Yj10aGlzLnRmKG13LmVycm9yRGVsZWdhdGVzKTp0b3AmJnRvcC53aW5kb3cmJnRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMmJihiPXRoaXMudGYodG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcykpO2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKWlmKDEwMDk9PWJbYV18fDMwMz09YlthXXx8NDAzPT1iW2FdKXJldHVybiEwO3JldHVybiExfX0pfSkoYyk7dmFyIE5iPWMuQ2p8fE5iOyhmdW5jdGlvbihjKXtjLkVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj0KbnVsbDt3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGUuRWEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscykmJihiPXdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpO3dpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8ZS5FYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpJiYoYj13aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpO2lmKCFiKXJldHVybjtmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtjJiYoYz1uZXcgTWIoYyksdGhpcy5IKGMpfHwodGhpcy5KKGMpLChuZXcgTmIoYyx0aGlzLkEpKS5iKCkpKX19dGhpcy5JKCl9fSl9KShjKTt2YXIgT2I9Yy5Fanx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkNzPXRoaXMuYVs1XTsKdGhpcy54aj10aGlzLmFbMl07dGhpcy5tdj10aGlzLmFbMl07dGhpcy56aj10aGlzLmFbNF07dGhpcy5Lbj10aGlzLmFbOV07dGhpcy5CaD10aGlzLmFbMV07dGhpcy5ybz10aGlzLmFbOF07dGhpcy5RaT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLlFuPWI7Yi5wcm90b3R5cGU9e0JzOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dczp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMueGo6dGhpcy5sdihhKX0sbHY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm12OnRoaXMueWooYSl9LHlqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuemo6dGhpcy5KbihhKX0sSm46ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLktuOnRoaXMuQWgoYSl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5CaDp0aGlzLnFvKGEpfSxxbzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm86dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8CmE/dGhpcy5RaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIFFiPWMuUW58fFFiLGhkPW5ldyBRYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWhkLkJzKDQpOyhmdW5jdGlvbihjKXtjLnNsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlAoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUyhiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKTDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgUmI9Yy5zbHx8UmI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5MZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGQoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLAoiSU1BIiksdGhpcy5vKCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTApfSxMZDpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5ybHx8U2I7KGZ1bmN0aW9uKGMpe2MudGw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmCiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgUmIoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSChiKXx8KHRoaXMuSihiKSwobmV3IFNiKGIsdGhpcy5BKSkuYigpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBUYj1jLnRsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQ3Y9dGhpcy5hWzhdO3RoaXMuQm09dGhpcy5hWzddO3RoaXMucWo9dGhpcy5hWzEwXTt0aGlzLmR0PXRoaXMuYVsxXTt0aGlzLkZyPXRoaXMuYVsyXTt0aGlzLlFwPXRoaXMuYVs0XTt0aGlzLnB2PXRoaXMuYVs2XTt0aGlzLkZtPXRoaXMuYVs4XTt0aGlzLnRwPXRoaXMuYVs5XTt0aGlzLk51PQp0aGlzLmFbMl07dGhpcy5nPXRoaXMuYVs3XX1jLkpzPWI7Yi5wcm90b3R5cGU9e0J2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ddjp0aGlzLkFtKGEpfSxBbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkJtOnRoaXMucGooYSl9LHBqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xajp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZHQ6dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5RcDp0aGlzLm92KGEpfSxvdjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnB2OnRoaXMuRW0oYSl9LEVtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5GbTp0aGlzLnNwKGEpfSxzcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHA6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk51OnRoaXMuZihhKX0sCmY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIFZiPWMuSnN8fFZiLGlkPW5ldyBWYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWlkLkJ2KDQpOyhmdW5jdGlvbihjKXtjLmFsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5QKGIpO3RoaXMuUyhiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmFlPSExfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy50dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHR0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLGE9dGhpcy5nZXREdXJhdGlvbigpOwpiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLksmJnRoaXMuSygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmFlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmFlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmYi5wbGF5YmFjay5nZXRQbGF5U3RhdGU/CihiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LER1OmZ1bmN0aW9uKCl7dGhpcy5hZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIFdiPWMuYWx8fFdiOyhmdW5jdGlvbihjKXtjLiRrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5LYj0wfSxiOmZ1bmN0aW9uKCl7dGhpcy5qcz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuS2J8fCh0aGlzLktiPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIpO3RoaXMubygpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8od2luZG93LnZpZGVvcGxhemEuYnVpbGREYXRlfHwKKHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLAp3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLktifHx0aGlzLktiKyssdGhpcy5LYjw9dGhpcy5qcz8odGhpcy5LYisrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKX0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRHUoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFhiPWMuJGt8fFhiOyhmdW5jdGlvbihjKXtjLmJsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBXYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLkgoYil8fCh0aGlzLkooYiksKG5ldyBYYihiLHRoaXMuQSkpLmIoKSkpO3RoaXMuSSgpfX0pfSkoYyk7dmFyIFliPWMuYmx8fFliLFpiPW5ldyBZYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5waT10aGlzLmFbOV07dGhpcy5wdT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLkRzPWI7Yi5wcm90b3R5cGU9e29pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5waTp0aGlzLm91KGEpfSxvdTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucHU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOgphfX19KShjKTt2YXIgJGI9Yy5Ec3x8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQub2koNCk7KGZ1bmN0aW9uKGMpe2MuV2s9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5QKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlMoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLksoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy5Xa3x8YWM7KGZ1bmN0aW9uKGMpe2MuVms9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuRGEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLApmdW5jdGlvbigpe3RoaXMub2IoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5QbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkxjKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5OcigpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxQbzpmdW5jdGlvbigpe3RoaXMuTWUoKXx8dGhpcy5vKCEwKX0sTnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7IWIubWEmJgpiLmJhJiZiLnZ3JiZiLnh3JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LExjOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmcpZm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkRhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWJbY10uaWQ9PQphJiYodGhpcy5iZz1iW2NdKTtyZXR1cm4gdGhpcy5iZ30sTGQ6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iP3RoaXMuTGMoKS5hZHNMb2FkZXI/dGhpcy53KCEwKTp0aGlzLncoKTp0aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgYmM9Yy5Wa3x8YmM7KGZ1bmN0aW9uKGMpe2MuWGs9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5wbGF5ZXJhcGkpe3ZhciBiPWsucGxheWVyYXBpKCk7aWYoYi5sZW5ndGgpe2Zvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgYz1uZXcgYWMoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYlthXS5pZCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pOwp0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9cmV0dXJufX10aGlzLkkoKX19KX0pKGMpO3ZhciBjYz1jLlhrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRnA9dGhpcy5hWzldO3RoaXMuR2k9dGhpcy5hWzZdO3RoaXMuS3I9dGhpcy5hWzNdO3RoaXMubmw9dGhpcy5hWzJdO3RoaXMucnY9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy5vbD1iO2IucHJvdG90eXBlPXtFcDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZwOnRoaXMuRmkoYSl9LEZpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5HaTp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuS3I6dGhpcy5tbChhKX0sbWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm5sOnRoaXMucXYoYSl9LHF2OmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucnY6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLm9sfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC5FcCg0KTsoZnVuY3Rpb24oYyl7Yy5aaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLlAoYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUyhhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LApwYXVzZTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEw6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LERhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJgoodGhpcy5jb250YWluZXI9Yik7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9Yy5aanx8VzsoZnVuY3Rpb24oYyl7Yy5Zaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5iZT0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLmJlPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuYmUmJmIhPXRoaXMuYmV8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS5VdyksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9iKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09CmEmJih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWD1jLllqfHxYOyhmdW5jdGlvbihjKXtjLiRqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFcoYiksYi5qYXx8dGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFgoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBXKGIpLGIuamE/dGhpcy5sZygpOnRoaXMuSChiKXx8KHRoaXMuSihiKSxiPW5ldyBYKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCxmYz1jLiRqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5wYi5sZW5ndGgpe3ZhciBhPW0ucGIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuZXUoeyJbTE9BRFNDUklQVF0iOmUucGEoMTApLCJbVVRJTFNdIjplLnBhKDEwKSwiW0NBTExCQUNLXSI6ZS5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuVmYuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGYgaW4gYSlrW2ZdPWFbZl07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLlZmKGcsCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgZmFpbGVkIil9LG0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudHY9dGhpcy5hWzJdO3RoaXMuZXM9dGhpcy5hWzFdO3RoaXMuY3Y9dGhpcy5hWzZdO3RoaXMuUHU9dGhpcy5hWzJdO3RoaXMuQXA9dGhpcy5hWzZdO3RoaXMuc2k9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbN119Yy55cD1iO2IucHJvdG90eXBlPXtzdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudHY6dGhpcy5kcyhhKX0sZHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVzOnRoaXMuYnYoYSl9LGJ2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5jdjp0aGlzLk91KGEpfSxPdTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLlB1OnRoaXMuenAoYSl9LHpwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5BcDp0aGlzLnJpKGEpfSxyaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuc2k6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLnlwfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5zdig0KTsoZnVuY3Rpb24oYyl7Yy5JbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuUChhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKYz8odGhpcy5TKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy54cz1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sWHQ6ZnVuY3Rpb24oYil7dGhpcy5xZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54c30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sTDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsCmZ1bmN0aW9uKGIpe3RoaXMucmIoYil9LmJpbmQodGhpcykpfSxyYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5LJiZ0aGlzLksoKSx0aGlzLnFkJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5xZCYmKG5ldyBHKHRoaXMsdGhpcy5xZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLklsfHxNOyhmdW5jdGlvbihjKXtjLkhsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5EZClpZih0aGlzLmlifHwodGhpcy5pYj0wKSx0aGlzLmliKyssMTU8dGhpcy5pYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJgp3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLmd1KCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuRGQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy53YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2EoKX0uYmluZCh0aGlzKSwKMTApfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLGEpKTpiLmwoImFkZXJyb3IiKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJgpiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5XYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7CmIudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEc9Yy5IbHx8RzsoZnVuY3Rpb24oYyl7Yy5KbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy54YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkgoYil8fAoodGhpcy5KKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkgoYil8fCh0aGlzLkooYiksYi5YdCh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgaWM9Yy5KbHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5MaD10aGlzLmFbOV07dGhpcy4kbD10aGlzLmFbNl07dGhpcy56aT10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbMl07dGhpcy5ncz10aGlzLmFbMl07dGhpcy5maD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLm5vPWI7Yi5wcm90b3R5cGU9e0toOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaDp0aGlzLlpsKGEpfSxabDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLiRsOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy56aTp0aGlzLnBtKGEpfSxwbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucW06dGhpcy5mcyhhKX0sZnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdzOnRoaXMuZWgoYSl9LGVoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5maDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPQpjLm5vfHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5LaCg0KTsoZnVuY3Rpb24oYyl7Yy5Vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5iZj0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5QKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5TKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iZn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSz8oMCx0aGlzLkspKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksCjQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3lvOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuYmY9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3lvOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5Vanx8bGM7KGZ1bmN0aW9uKGMpe2MuVGo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sWXc6ZnVuY3Rpb24oKXt9LEZ0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAuQmUobmV3IGZ1bmN0aW9uKCl7fSk7CmEuc3c9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuRnQoYSk7d2luZG93LkF3PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLkV0fHwodGhpcy5FdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLklkfHwodGhpcy5JZD0xKTtpZigyMDx0aGlzLklkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTsKcmV0dXJufXRoaXMuSWQrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTsKd2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmhlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT0KdHlwZW9mIGEmJmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0saGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuWCghMCl9LmJpbmQodGhpcykpfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMuVGp8fG1jOyhmdW5jdGlvbihjKXtjLlZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkgoYyl8fCh0aGlzLkooYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgbmM9Yy5Wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5zPXRoaXMuYVs4XTt0aGlzLnhxPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzhdfWMubnQ9YjtiLnByb3RvdHlwZT17TXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5zOnRoaXMud3EoYSl9LHdxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy54cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLm50fHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5Ncyg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlAoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5TKGEpO2EmJnRoaXMuUChhLnBhcmVudE5vZGUpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpOwp2YXIgWT1jLkxqfHxZOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLkVmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5XYT10aGlzLnNjPSExO3RoaXMuamc9ZS5sYigxMCk7dGhpcy5OZigpfSxOZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMuSGEoKSwhMDt0aGlzLkVmKys7aWYoMTA8dGhpcy5FZil0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5vKCEwKToKdGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5OZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLAoyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlgoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFg6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dmFyIGE9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFo9Yy5Lanx8WjsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYKKGI9bmV3IFkod2luZG93LnBsYXllciksdGhpcy5IKGIpfHwodGhpcy5KKGIpLGI9bmV3IFooYix0aGlzLkEpLGIuYigpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5xPXRoaXMuYVsyXTt0aGlzLktxPXRoaXMuYVs0XTt0aGlzLnNuPXRoaXMuYVsxXTt0aGlzLlVrPXRoaXMuYVsxXTt0aGlzLlB0PXRoaXMuYVs4XTt0aGlzLkdqPXRoaXMuYVsxMF07dGhpcy53bz10aGlzLmFbNF07dGhpcy5hdj10aGlzLmFbMTBdO3RoaXMuem09dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNl19Yy5Hcj1iO2IucHJvdG90eXBlPXtNcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk5xOnRoaXMuSnEoYSl9LEpxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LcTp0aGlzLnJuKGEpfSxybjpmdW5jdGlvbihhKXtyZXR1cm4gODwKYT90aGlzLnNuOnRoaXMuVGsoYSl9LFRrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWs6dGhpcy5PdChhKX0sT3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB0OnRoaXMuRmooYSl9LEZqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hajp0aGlzLnZvKGEpfSx2bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMud286dGhpcy4kdShhKX0sJHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmF2OnRoaXMueW0oYSl9LHltOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56bTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMuR3J8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLk1xKDQpOyhmdW5jdGlvbihjKXtjLk5pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5QKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuUyhiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5OaXx8dGM7KGZ1bmN0aW9uKGMpe2MuTWk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksCnRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sbzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5NaXx8dWM7KGZ1bmN0aW9uKGMpe2MuT2k9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy54YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGUuRWEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkgoZCl8fCh0aGlzLkooZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7CmVsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgdmM9Yy5PaXx8dmMsd2M9bmV3IHZjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlRxPXRoaXMuYVszXTt0aGlzLkN0PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVs0XTt0aGlzLlZxPXRoaXMuYVszXTt0aGlzLlp2PXRoaXMuYVs1XTt0aGlzLmJtPXRoaXMuYVsyXTt0aGlzLlhvPXRoaXMuYVs1XTt0aGlzLllxPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuSGo9YjtiLnByb3RvdHlwZT17U3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5DdDp0aGlzLklrKGEpfSxJazpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSms6dGhpcy5VcShhKX0sVXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlZxOnRoaXMuWXYoYSl9LApZdjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWnY6dGhpcy5hbShhKX0sYW06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ibTp0aGlzLldvKGEpfSxXbzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlhvOnRoaXMuWHEoYSl9LFhxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ZcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIHhjPWMuSGp8fHhjLHBkPW5ldyB4YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXBkLlNxKDQpOyhmdW5jdGlvbihjKXtjLlVpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YiYmCmE/KHRoaXMuUChiKSx0aGlzLlMoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxMOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciB5Yz1jLlVpfHx5YzsoZnVuY3Rpb24oYyl7Yy5UaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5XZSgpfSxXZTpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuV2UoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIHpjPWMuVGl8fHpjOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIuamEpe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5IKGIpKXt0aGlzLkooYik7KG5ldyB6YyhiLHRoaXMuQSkpLmIoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7dmFyIEFjPWMuVml8fEFjLEJjPW5ldyBBYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbM107dGhpcy5VdD10aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbOV07dGhpcy5Dbj10aGlzLmFbNl07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs5XX1jLkdoPWI7Yi5wcm90b3R5cGU9CntYbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuWW46dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlV0OnRoaXMuRGwoYSl9LERsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5FbDp0aGlzLkJuKGEpfSxCbjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQ246dGhpcy5pbyhhKX0saW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpvOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5HaHx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuWG4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUGY9dGhpcy5TZj10aGlzLlJmPSExO3RoaXMuWGM9W107dGhpcy5mZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT0KdHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgRWE/bnVsbDpFYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFRhP251bGw6VGEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBZYT9udWxsOllhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLApiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB5Yj9udWxsOnliLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgY2I/bnVsbDpjYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgaGI/bnVsbDpoYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB6YT9udWxsOnphLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE9hP251bGw6T2EsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT0KdHlwZW9mIHBhP251bGw6cGF9fWMuTWs9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5tcShhKTpbXSxiO3RoaXMuU2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuUmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMubWcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmZlKXtpZih0aGlzLlBmKWJyZWFrO2I9dGhpcy5mZVtjXTt0aGlzLnZlKGIpJiYodGhpcy5YYy5wdXNoKGIpLHRoaXMubWcoYikpfX0sdmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxtcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5mZVtjXSx0aGlzLnZlKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEpe3RoaXMudmUoYSkmJmEuYigpfSxGdTpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YKcCYmIXRoaXMuUmYpZm9yKHRoaXMuUGY9ITAsYT0wO2E8dGhpcy5YYy5sZW5ndGg7YSsrKXRoaXMuWGNbYV0uc2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5YY1thXS5zYil9fX0pKGMpO3ZhciBEYz1jLk1rfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5YZz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVszXX1jLldpPWI7Yi5wcm90b3R5cGU9e1dnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLldpfHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5XZyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBiPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuVGIobC52diksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuVGIobC5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTsKdmFyIHNkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksZWE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IFEsaz0hMTtGLlliKCk7Ri5KZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuWWIoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkpmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5ZYigpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxGLmxyKCkse2lkOnRkfSl9LDUwMCk7ZGEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy50dT10aGlzLmFbOF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5Caj10aGlzLmFbMTBdO3RoaXMuVW49dGhpcy5hWzVdOwp0aGlzLnlrPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzddfWMuSHE9YjtiLnByb3RvdHlwZT17c3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnR1OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5TaTp0aGlzLkFqKGEpfSxBajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuQmo6dGhpcy5UbihhKX0sVG46ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlVuOnRoaXMueGsoYSl9LHhrOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueWs6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLkhxfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC5zdSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuaGc9dGhpcy5jb25mPXRoaXMuVmE9CnRoaXMucGxheWVyPW51bGw7dGhpcy5TYz0wO3RoaXMuTmE9IiI7dGhpcy5ZYz1bXTt0aGlzLlpjPTA7dGhpcy5pZz0hMTt0aGlzLmNlPVtdfWMuVWc9YjtiLnByb3RvdHlwZT17ZHU6ZnVuY3Rpb24oYSl7dGhpcy5oZz1hfSxhZDpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hO3RoaXMuTmE9dGhpcy5wbGF5ZXIuTCgpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFp0OmZ1bmN0aW9uKGEpe3RoaXMuVmE9YX0sWXQ6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHVhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5OYV0mJnRoaXMuY29uZlt0aGlzLk5hXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTmFdW2FdKTtyZXR1cm4gYn0sZGM6ZnVuY3Rpb24oYSxiKXtlLmpiKCJ3ZWx0LmRlIikmJmUuTGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iKwplbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLlZhKTt2YXIgYz0hMSxmPSExO2lmKHRoaXMubXIoKSl0aGlzLlZhLmModGhpcy5WYS5OYyx0aGlzLlZhLkJhLHRoaXMuVmEuZWUsZnVuY3Rpb24oKXt0aGlzLmRjKGEsYil9LmJpbmQodGhpcyksdGhpcy5WYS5EYyk7ZWxzZSBpZih0aGlzLkZxKCkpdGhpcy5RdChmdW5jdGlvbigpe3RoaXMuZGMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UuRChsLkFjLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkd1KCk7ay5leGl0RnVsbHNjcmVlbigpO1I9az1uZXcgTyhrLAp0aGlzLlZhLGgpO2sucGcodGhpcy5jb25mKTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBtPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKG09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShtKX1hPXRoaXMuaHMoYSk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk1kJiYoYz10aGlzLnBsYXllci5NZCgpKTtoLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5PZChhLGMsZik7dGhpcy5wbGF5ZXIucWcoayl9fSxtcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlNjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuU2MuZ2V0VGltZSgpLHRoaXMuU2M9YSwzRTU8Yj8hMDohMTt0aGlzLlNjPWE7cmV0dXJuITF9LHZ1OmZ1bmN0aW9uKCl7ZS5qZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudWEoImFkVGFnIik7dGhpcy51YSgicHJlcm9sbEFkVGFnIikmJgooYT10aGlzLnVhKCJwcmVyb2xsQWRUYWciKSk7KGE9dGhpcy5qZihhKSk/dGhpcy5kYyhhKTooc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX0sdXU6ZnVuY3Rpb24oYSl7ZS5qZSgicG9zdHJvbGwiKTtpZighdGhpcy5oZyl7dGhpcy5kdSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5qZihjKSk/dGhpcy5kYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZS5EKGwuQmMsdGhpcy5wbGF5ZXIuQigpKSl9fSxqZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9CmEoYil9cmV0dXJuIGF9LEh0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuaXUodGhpcy51dS5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5lYSgpfSxjZDpmdW5jdGlvbihhKXtlLmplKCJtaWRyb2xsIik7aWYoIXRoaXMuWGYpe3RoaXMuWGY9ITA7dmFyIGI9dGhpcy51YSgiYWRUYWciKTt0aGlzLnVhKCJtaWRyb2xsQWRUYWciKSYmKGI9dGhpcy51YSgibWlkcm9sbEFkVGFnIikpO2I/KHRoaXMuZGMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGY9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxlLkQobC5CYyx0aGlzLnBsYXllci5CKCkpKX19LEd0OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIuY3UodGhpcy5jZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5TZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy52dSgpO3RoaXMucGxheWVyLlNkJiZ0aGlzLkd0KCk7dGhpcy5IdCgpfSxJdDpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdPwphPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5ZYy5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLlpjPXRoaXMuWWMubGVuZ3RofSxGcTpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5aYyYmKGE9ITApO3JldHVybiBhfSxRdDpmdW5jdGlvbihhKXt0aGlzLmlnPWE7Zm9yKGE9MDthPHRoaXMuWWMubGVuZ3RoO2ErKyl0aGlzLlljW2FdWyJmdW5jdGlvbiJdKHRoaXMud3QuYmluZCh0aGlzKSl9LHd0OmZ1bmN0aW9uKGEpe3RoaXMuWmMtLTthJiZ0aGlzLmNlLnB1c2goYSk7MD49dGhpcy5aYyYmdGhpcy5pZygpfSxoczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5jZS5sZW5ndGg7YysrKWI9CnRoaXMuY2VbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGdhPWMuVWd8fGdhLFI9ITEsbGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYnI9dGhpcy5hWzEwXTt0aGlzLm9wPXRoaXMuYVszXTt0aGlzLnJoPXRoaXMuYVs2XTt0aGlzLmRtPXRoaXMuYVs2XTt0aGlzLmx1PXRoaXMuYVszXTt0aGlzLnB0PXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVsxMF07dGhpcy5obz10aGlzLmFbMTBdO3RoaXMuUm09dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzhdfWMudmk9YjtiLnByb3RvdHlwZT17YXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmJyOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMub3A6dGhpcy5xaChhKX0scWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnJoOnRoaXMuY20oYSl9LApjbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmRtOnRoaXMua3UoYSl9LGt1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5sdTp0aGlzLm90KGEpfSxvdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHQ6dGhpcy5TaChhKX0sU2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlRoOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obzp0aGlzLlFtKGEpfSxRbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUm06dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYz1jLnZpfHxHYyx2ZD1uZXcgR2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj12ZC5hcig0KX0pLmNhbGwobmFlR2hhaVRFaWtlaXNpZSxuYWVHaGFpVEVpa2Vpc2llKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.139.104 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.104.139.251.148.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
480f7a2020234eb7d1f5745fbc8ec7f6535905cdeddda4a8b5d63bf6466c33c5

Request headers

Pragma
no-cache
Origin
https://www.chip.de
Accept-Encoding
gzip, deflate
Host
ssl.3.damoh.chip.de
User-Agent
Mozilla/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.chip.de/downloads/Android-File-Transfer_53192185.html
Cookie
CXOid=0.28632896932745; s_fid=4C84469BB7195702-079F35F47EAAC35F; gpv=ir-13725907%20%7C%20android%20file%20transfer%20%5Bdownloads%20%3E%20macos%5D; s_dslv_s=First%20Visit; s_vnum=1568125717945%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C39%2C39%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_dslv=1536589717964; s_vi=[CS]v1|2DCB3FCB053131F8-6000010DE0000391[CE]; __gads=ID=78a6ac6d7af67528:T=1536589718:S=ALNI_MYvYVimTcb8GVmRj4yhsb2D8tOpVg
Connection
keep-alive
Content-Length
371
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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
Mon, 10 Sep 2018 14:28:39 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.chip.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
109
config.json
c.go-mpulse.net/api/ Frame 45EF
913 B
879 B
XHR
General
Full URL
https://c.go-mpulse.net/api/config.json?key=DG6LL-C2K3J-45PG2-VMF2Q-KM6V9&d=www.chip.de&t=5121966&v=1.571.0&if=&sl=0&si=6ekojsglqj-NaN&plugins=ConfigOverride,Continuity,PageParams,IFrameDelay,AutoXHR,SPA,Angular,Backbone,Ember,History,RT,CrossDomain,BW,PaintTiming,NavigationTiming,ResourceTiming,Memory,CACHE_RELOAD,Errors,TPAnalytics,UserTiming,LOGN&acao=
Requested by
Host: s.go-mpulse.net
URL: https://s.go-mpulse.net/boomerang/DG6LL-C2K3J-45PG2-VMF2Q-KM6V9
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
104.108.48.32 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-108-48-32.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
6505922a9a43605568eb50ec69e4a6a36b19bec67067c67de90c27fed687e35c

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.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de

Response headers

Date
Mon, 10 Sep 2018 14:28:39 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Type
application/json
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
private, max-age=300, stale-while-revalidate=60, stale-if-error=120
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
541
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/ Frame 8C91
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_246.js?cb=243
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
1479
date
Wed, 05 Sep 2018 20:44:38 GMT
expires
Thu, 05 Sep 2019 20:44:38 GMT
last-modified
Mon, 11 Jun 2018 14:38:59 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
409441
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
native-loader.js
video.unrulymedia.com/native/
7 KB
3 KB
Script
General
Full URL
https://video.unrulymedia.com/native/native-loader.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.71.169 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-71-169.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
5b58686217cec6765ea771d68b6e150c01f272e66aeb93a3bac137cb365c0810

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Content-Encoding
gzip
Last-Modified
Mon, 10 Sep 2018 13:54:45 GMT
Server
AmazonS3
x-amz-request-id
323187C0B05F74CA
ETag
"dc0eb87c492fd40f5c22ed9da95c057b"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=140
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2720
x-amz-id-2
X+5/7PhPw0BvALKI21LQHjugMdHq7RTTzPCglaIx56bsYfJGbvyfKJ9QAUG43FIHUR3WR9HsLp4=
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/3.1.1/ Frame C826
85 KB
30 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
Requested by
Host: video.unrulymedia.com
URL: https://video.unrulymedia.com/native/native-loader.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:825::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
85556761a8800d14ced8fcd41a6b8b26bf012d44a318866c0d81a62092efd9bf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 03 Sep 2018 12:18:59 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
612580
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
30244
x-xss-protection
1; mode=block
last-modified
Tue, 20 Dec 2016 18:17:03 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Tue, 03 Sep 2019 12:18:59 GMT
blank.gif
stats3.unrulymedia.com/
43 B
607 B
Image
General
Full URL
https://stats3.unrulymedia.com/blank.gif?t=pp_tag_imp&app=native&pid=1026066&id=683022555&d=1536589719234&in_iframe=false&h=v1.0.1155-4-g960324b&compat=CSS1Compat&pageLoadId=20347011&supplyMode=direct&unr.site.env=html
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
34.252.16.212 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-16-212.eu-west-1.compute.amazonaws.com
Software
nginx/1.4.2 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx/1.4.2
X-Unruly-Server
stats3n-eu-043.unrulymedia.com
P3P
CP="CUR IVDo OUR IND"
Cache-Control
no-store,no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
native_v1.0.1155-4-g960324b.js
video.unrulymedia.com/native/ Frame C826
56 KB
16 KB
Script
General
Full URL
https://video.unrulymedia.com/native/native_v1.0.1155-4-g960324b.js
Requested by
Host: video.unrulymedia.com
URL: https://video.unrulymedia.com/native/native-loader.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.71.169 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-71-169.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
dcacf94b511a1f0117435853d4ba31fead3db09fe316fb4cb476b218bb454aee

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Content-Encoding
gzip
Last-Modified
Thu, 06 Sep 2018 14:30:26 GMT
Server
AmazonS3
x-amz-request-id
ADA2247443AA9318
ETag
"d272b1b72c0538da57620309fe9f3320"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=62726497
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
15458
x-amz-id-2
Aag9JY0ymCIZYycB4lReeUHJOWsKY1zrWwMqz8DbbDddMLPlbMxqmRPTnfZYLB7oU61BtWMhsk4=
skin-1026066.json
cloud-video.unrulymedia.com/native/skins/ Frame C826
1 KB
870 B
XHR
General
Full URL
https://cloud-video.unrulymedia.com/native/skins/skin-1026066.json
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.222.153.135 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-153-135.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
f6c43322b78f17d931449a03f935d47d05b89f578fc6a62d8067b37d7fec5d8a

Request headers

Accept
application/json, text/javascript, */*; q=0.01
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/5.0 (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, 04 Sep 2018 09:25:12 GMT
content-encoding
gzip
vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
age
2517
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
https://www.chip.de
last-modified
Tue, 04 Sep 2018 02:35:44 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/json
via
1.1 c0486ca54d4ad5a3da496bc2b5f49cd2.cloudfront.net (CloudFront)
cache-control
max-age=3600
access-control-allow-credentials
true
x-amz-cf-id
u4ppcmnDdYEV6Ef1Gu8OjmR0wdQDvKW17uN8kKoDxdXhq8-exrRCtw==
blank.gif
stats3.unrulymedia.com/ Frame C826
43 B
607 B
Image
General
Full URL
https://stats3.unrulymedia.com/blank.gif?t=consent&gdpr=1&gdpr_consent=BOT4PvXOT4PvpAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA&message=successful%20in%20retrieving%20consent%20data&app=native&pid=1026066&supplyMode=direct&isMobile=false&pageLoadId=20347011&unr.site.env=html&perf_consent_start=1536589719317&perf_consent_end=1536589719335&perf_corejs_start=1536589719234&perf_corejs_end=1536589719317&perf_skin_start=1536589719320&id=683022555&d=1536589719338&h=v1.0.1155-4-g960324b
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
34.252.16.212 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-16-212.eu-west-1.compute.amazonaws.com
Software
nginx/1.4.2 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx/1.4.2
X-Unruly-Server
stats3n-eu-043.unrulymedia.com
P3P
CP="CUR IVDo OUR IND"
Cache-Control
no-store,no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
vendors~populatePlacement-908105528161f418a882.chunk.js
video.unrulymedia.com/native/chunks/ Frame C826
109 KB
29 KB
Script
General
Full URL
https://video.unrulymedia.com/native/chunks/vendors~populatePlacement-908105528161f418a882.chunk.js
Requested by
Host: video.unrulymedia.com
URL: https://video.unrulymedia.com/native/native_v1.0.1155-4-g960324b.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.71.169 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-71-169.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
4237fbd5c8f82cc0ae589a15643eaa4761da7287070ca74ad15cbc38316f889a

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Content-Encoding
gzip
Last-Modified
Thu, 06 Sep 2018 14:30:28 GMT
Server
AmazonS3
x-amz-request-id
7B3FEE0FD1653C40
ETag
"d6df29622ed3e937af06a3fa057f8c10"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=62726474
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
29138
x-amz-id-2
TI7TNi3SiQwnfHJkEAhAqAyyvjZ5ea2RaDxxr+FyT5m+BedWG/lCNLlWZe55hvcVO/AVfbFch0Q=
populatePlacement-ada1f20a982c99c06e2e.chunk.js
video.unrulymedia.com/native/chunks/ Frame C826
81 KB
20 KB
Script
General
Full URL
https://video.unrulymedia.com/native/chunks/populatePlacement-ada1f20a982c99c06e2e.chunk.js
Requested by
Host: video.unrulymedia.com
URL: https://video.unrulymedia.com/native/native_v1.0.1155-4-g960324b.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.71.169 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-71-169.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
952f1bbc4ca6e8f2d37d4ea65956bb66d6c0761cf8a764ad70e886ea1c90951b

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Content-Encoding
gzip
Last-Modified
Thu, 06 Sep 2018 14:30:29 GMT
Server
AmazonS3
x-amz-request-id
0D2D0892BE21AA70
ETag
"42cd697e1cd393c49e85a9a31bffd1c4"
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=62726557
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
19991
x-amz-id-2
W62oO+5Xglw2yhuvqbiE2lVCS7UzLIwAEtU9inAdf7M4TAj1eUITZbuCw4PUj22nraPgjIAjTB0=
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/ Frame 3EDE
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_246.js?cb=243
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
1479
date
Wed, 05 Sep 2018 20:44:38 GMT
expires
Thu, 05 Sep 2019 20:44:38 GMT
last-modified
Mon, 11 Jun 2018 14:38:59 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
409441
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
blank.gif
stats3.unrulymedia.com/ Frame C826
43 B
495 B
Image
General
Full URL
https://stats3.unrulymedia.com/blank.gif?t=pp_adcall&site.page=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&site.domain=www.chip.de&gdpr=1&gdpr_consent=BOT4PvXOT4PvpAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA&placementName=Chip.de%20Downloads%20-%20In-Article&adf=inarticle&imp%5B0%5D.placement=3&supplyMode=direct&app=native&pid=1026066&isMobile=false&pageLoadId=20347011&unr.site.env=html&perf_consent_start=1536589719317&perf_consent_end=1536589719335&perf_corejs_start=1536589719234&perf_corejs_end=1536589719317&perf_skin_start=1536589719320&perf_skin_end=1536589719365&perf_adAge_start=1536589719425&id=683022555&d=1536589719426&h=v1.0.1155-4-g960324b
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
34.252.16.212 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-16-212.eu-west-1.compute.amazonaws.com
Software
nginx/1.4.2 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx/1.4.2
X-Unruly-Server
stats3n-eu-043.unrulymedia.com
P3P
CP="CUR IVDo OUR IND"
Cache-Control
no-store,no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
vast
targeting.unrulymedia.com/ Frame C826
75 B
395 B
XHR
General
Full URL
https://targeting.unrulymedia.com/vast?uuid=68886cf3-2781-4561-a8d1-48fffefd9358&site.page=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FAndroid-File-Transfer_53192185.html&site.domain=www.chip.de&gdpr=1&gdpr_consent=BOT4PvXOT4PvpAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA&video_width=600&video_height=337&imp%5B0%5D.placement=3&unr.site.env=html&h=v1.0.1155-4-g960324b
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.154.209.235 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-154-209-235.eu-west-1.compute.amazonaws.com
Software
nginx/1.10.2 /
Resource Hash
bb806aec2acf3fad6e52d40cfa7dbbd4ebe64f99fafb1390e26993262c46f1d2

Request headers

Accept
application/xml, text/xml, */*; q=0.01
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Server
nginx/1.10.2
X-Unruly-Server
unrulyx-eu-209.unrulymedia.com
P3P
CP="CUR IVDo OUR IND"
Access-Control-Allow-Origin
https://www.chip.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/xml
Content-Length
75
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180904/r20110914/activeview/ Frame 0F3B
73 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180904/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
d9262cbf7f04dd3b4ba9b73a11cbd614a1e707f22317611aac9d294b20a85103
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Tue, 04 Sep 2018 18:54:06 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
502472
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
27233
x-xss-protection
1; mode=block
server
cafe
etag
12076525581148098716
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 18 Sep 2018 18:54:06 GMT
truncated
/ Frame 0F3B
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
80c12dda89b3ff3e58285446aea0d15c6471d320a22b02b3aa73e24a63785f89

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 0F3B
0
47 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst42DhAaupfmsMr8z9qi36XHDNPdjUbB8HYjejkhbadT6Iv_uhBOWzk2HpiH71e1sV4q9t34ZoVoisYc4w_sQaBrnemiT-PPAYREPrCIGmrGQ4FK8uITruV4yKKAOjoTIrMRDnmsXQo9r0DiSE0BvpQD-fNigCanp4fNjuKgNAIKGhYYOgDsXoLde957R9DmvCA9BCXV3taruM3eCaRcSROU4FHboFGu-QYo0Yu-7vQyxsV7UuwO6wH8Rpw0AD4Hic3_jSPvFUMOGvwWR7I&sai=AMfl-YQ734hUMdQUmhWhA9K8nG0s9Uh8GB2wuImVKjrsgCGfOBTzliiAeiK0tw0qAFoP9D0c1JAeReOMr2KCSiyDMFwMfnt07jhiRqXH8Tqerz3jXY_293L21wWby-s&sig=Cg0ArKJSzE11DiAPjH0zEAE&urlfix=1&adurl=
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

cache-control
private
content-type
text/html; charset=UTF-8
oba_icon.png
a.bf-ad.net/makabo/infolayer/
1 KB
2 KB
Image
General
Full URL
https://a.bf-ad.net/makabo/infolayer/oba_icon.png
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:292::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
30c065c5189582302f1fc91edd7f8c99956f6f8bd6c4b242081f41ab1c772b08

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Last-Modified
Fri, 22 Sep 2017 12:02:08 GMT
Server
Apache
ETag
"06500e222cb4c36f129c357ffef7ad59:1507297036"
Content-Type
image/png
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1319
Expires
Mon, 10 Sep 2018 14:43:39 GMT
close_icon.svg
a.bf-ad.net/makabo/infolayer/
249 B
564 B
Image
General
Full URL
https://a.bf-ad.net/makabo/infolayer/close_icon.svg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28b::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
6c2ad417bbd7492018e6d055a44ac6bbe8ba22eaadfee5f2b0bfacf14e656d22

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Content-Encoding
gzip
Last-Modified
Fri, 22 Sep 2017 14:10:20 GMT
Server
Apache
ETag
"e3de999fc591bfe4c5f337326f62ebf6:1507297035"
Vary
Accept-Encoding
Content-Type
image/svg+xml
Cache-Control
max-age=900
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
182
Expires
Mon, 10 Sep 2018 14:43:39 GMT
amp4ads-v0.js
cdn.ampproject.org/rtv/011535566825959/ Frame 5168
260 KB
83 KB
Script
General
Full URL
https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
46ab33a1c2d56dc8299e8bef5c29466ae9356a4515ddd449a0bfc05aa5e84af8
Security Headers
Name Value
Content-Security-Policy default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
Strict-Transport-Security max-age=31536000; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

content-security-policy
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
content-encoding
gzip
x-content-type-options
nosniff
age
1005550
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
84387
x-xss-protection
1; mode=block
last-modified
Wed, 29 Aug 2018 20:15:00 GMT
server
sffe
date
Wed, 29 Aug 2018 23:09:29 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
content-type
text/javascript
access-control-allow-origin
*
vary
Accept-Encoding
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 29 Aug 2019 23:09:29 GMT
amp-analytics-0.1.js
cdn.ampproject.org/rtv/011535566825959/v0/ Frame 5168
110 KB
35 KB
Script
General
Full URL
https://cdn.ampproject.org/rtv/011535566825959/v0/amp-analytics-0.1.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_246.js?v=243
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
670506f73688fc179c5821d61cde38f34a52bb20a32021272d6216bb88488830
Security Headers
Name Value
Content-Security-Policy default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
Strict-Transport-Security max-age=31536000; includeSubDomains; preload
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

content-security-policy
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp
content-encoding
gzip
x-content-type-options
nosniff
age
612583
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
35847
x-xss-protection
1; mode=block
last-modified
Wed, 29 Aug 2018 20:15:00 GMT
server
sffe
date
Mon, 03 Sep 2018 12:18:56 GMT
strict-transport-security
max-age=31536000; includeSubDomains; preload
content-type
text/javascript
access-control-allow-origin
*
vary
Accept-Encoding
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Tue, 03 Sep 2019 12:18:56 GMT
2702994414372938371
tpc.googlesyndication.com/simgad/ Frame 5168
38 KB
38 KB
Image
General
Full URL
https://tpc.googlesyndication.com/simgad/2702994414372938371
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4ba552c11110fca501ffc26419491d101b5249a982438e0de4cfae032a782941
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 31 Aug 2018 15:40:47 GMT
x-content-type-options
nosniff
age
859672
x-dns-prefetch-control
off
status
200
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
38915
x-xss-protection
1; mode=block
last-modified
Fri, 14 Jul 2017 08:10:14 GMT
server
sffe
content-type
image/jpeg
access-control-allow-origin
*
cache-control
public, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
expires
Sat, 31 Aug 2019 15:40:47 GMT
1x1_default.gif
s0.2mdn.net/viewad/5195550/ Frame 5168
Redirect Chain
  • https://ad.doubleclick.net/ddm/ad/N9551.2010700FORWARDADGROUP/B10146152.136200257;sz=1x1;ord=756788759;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?
  • https://ad.doubleclick.net/ddm/ad/N9551.2010700FORWARDADGROUP/B10146152.136200257;dc_pre=COa1oePSsN0CFQuR3godwkoD8A;sz=1x1;ord=756788759;dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?
  • https://s0.2mdn.net/viewad/5195550/1x1_default.gif
1 KB
1 KB
Image
General
Full URL
https://s0.2mdn.net/viewad/5195550/1x1_default.gif
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2006 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
69f6ed7f178885f3442df08d55280f891b5b55d6312b459ffaa648f2fad95cec
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 13:40:04 GMT
x-content-type-options
nosniff
last-modified
Fri, 03 Jun 2016 16:11:32 GMT
server
sffe
age
2915
status
200
content-type
image/gif
access-control-allow-origin
*
cache-control
public, max-age=86400
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
1093
x-xss-protection
1; mode=block
expires
Tue, 11 Sep 2018 13:40:04 GMT

Redirect headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:39 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
302
content-type
text/html; charset=UTF-8
location
https://s0.2mdn.net/viewad/5195550/1x1_default.gif
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 5168
0
56 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstwyxMPC-_PMPNa2MKXfRApH9dbOYpfk6Qk4Ru4RZSQCr2EKHkYsBiwTrIN4cQZyldFvWnV8IUVXCl3ansvFngravpWmLM5Bn3ICdlNGHWJFDXJwSfCk58OHvv21840UCYNEHSlUMrgmi6WGyoprYtTNGoxbBkU9UntItEwB6B7nwm3Bag8CMq-ZrYC3Z5XWDCSn3oCZbOP0YR5y3jtk02nERdGJdUZdkk0qxZNg5hUY-IS8j2tSpRmu04ZK_S0QXupHH1cgsd7rw-m7_G94Q&sai=AMfl-YSjD2JWjtQxDY_Z1rPffKhZ6-ESTL6noUOvckRDPXTjSdxkFm9dQp5zuEFVAtm_PIHps-arRl3MF83M14AYWqdqQFRCtFjcwylAjLd17zYztyCpo8GAzNYx7P8&sig=Cg0ArKJSzBQTaWPTl8WPEAE&adurl=
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
172.217.21.194 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s12-in-f2.1e100.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

cache-control
private
content-type
text/html; charset=UTF-8
blank.gif
stats3.unrulymedia.com/ Frame C826
43 B
495 B
Image
General
Full URL
https://stats3.unrulymedia.com/blank.gif?t=vast_request_0&vast_url=%2F%2Ftargeting.unrulymedia.com%2Fvast%3Fuuid%3D68886cf3-2781-4561-a8d1-48fffefd9358%26site.page%3Dhttps%253A%252F%252Fwww.chip.de%252Fdownloads%252FAndroid-File-Transfer_53192185.html%26site.domain%3Dwww.chip.de%26gdpr%3D1%26gdpr_consent%3DBOT4PvXOT4PvpAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26video_width%3D600%26video_height%3D337%26imp%255B0%255D.placement%3D3%26unr.site.env%3Dhtml%26h%3Dv1.0.1155-4-g960324b&app=native&pid=1026066&supplyMode=direct&isMobile=false&pageLoadId=20347011&unr.site.env=html&perf_consent_start=1536589719317&perf_consent_end=1536589719335&perf_corejs_start=1536589719234&perf_corejs_end=1536589719317&perf_skin_start=1536589719320&perf_skin_end=1536589719365&perf_adAge_start=1536589719425&perf_vast_0_start=1536589719429&perf_vast_0_end=1536589719692&id=683022555&d=1536589719692&h=v1.0.1155-4-g960324b
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
34.252.16.212 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-252-16-212.eu-west-1.compute.amazonaws.com
Software
nginx/1.4.2 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx/1.4.2
X-Unruly-Server
stats3n-eu-043.unrulymedia.com
P3P
CP="CUR IVDo OUR IND"
Cache-Control
no-store,no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
error
targaryen.unrulymedia.com/ Frame C826
0
289 B
XHR
General
Full URL
https://targaryen.unrulymedia.com/error
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.48.133.165 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-48-133-165.eu-west-1.compute.amazonaws.com
Software
Jetty(9.4.z-SNAPSHOT) /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Access-Control-Allow-Origin
https://www.chip.de
Date
Mon, 10 Sep 2018 14:28:39 GMT
Access-Control-Allow-Credentials
true
Server
Jetty(9.4.z-SNAPSHOT)
Access-Control-Allow-Headers
Content-Type
Content-Length
0
Access-Control-Allow-Methods
POST,OPTIONS,HEAD
blank.gif
stats3.unrulymedia.com/ Frame C826
43 B
495 B
Image
General
Full URL
https://stats3.unrulymedia.com/blank.gif?t=no_ads&vastURL=%2F%2Ftargeting.unrulymedia.com%2Fvast%3Fuuid%3D68886cf3-2781-4561-a8d1-48fffefd9358%26site.page%3Dhttps%253A%252F%252Fwww.chip.de%252Fdownloads%252FAndroid-File-Transfer_53192185.html%26site.domain%3Dwww.chip.de%26gdpr%3D1%26gdpr_consent%3DBOT4PvXOT4PvpAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26video_width%3D600%26video_height%3D337%26imp%255B0%255D.placement%3D3%26unr.site.env%3Dhtml%26h%3Dv1.0.1155-4-g960324b&placementName=Chip.de%20Downloads%20-%20In-Article&adf=inarticle&imp%5B0%5D.placement=3&supplyMode=direct&message=VAST%20Error%3A%20%5B303%5D%20-%20VAST%20request%20returned%20no%20ads&app=native&pid=1026066&isMobile=false&pageLoadId=20347011&unr.site.env=html&perf_consent_start=1536589719317&perf_consent_end=1536589719335&perf_corejs_start=1536589719234&perf_corejs_end=1536589719317&perf_skin_start=1536589719320&perf_skin_end=1536589719365&perf_adAge_start=1536589719425&perf_vast_0_start=1536589719429&perf_vast_0_end=1536589719692&id=683022555&d=1536589719694&h=v1.0.1155-4-g960324b
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_128_CBC
Server
34.242.119.131 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-34-242-119-131.eu-west-1.compute.amazonaws.com
Software
nginx/1.4.2 /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 10 Sep 2018 14:28:39 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx/1.4.2
X-Unruly-Server
stats3n-eu-044.unrulymedia.com
P3P
CP="CUR IVDo OUR IND"
Cache-Control
no-store,no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
error
targaryen.unrulymedia.com/ Frame C826
0
278 B
XHR
General
Full URL
https://targaryen.unrulymedia.com/error
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.48.133.165 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-48-133-165.eu-west-1.compute.amazonaws.com
Software
Jetty(9.4.z-SNAPSHOT) /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
application/json, text/javascript, */*; q=0.01
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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/json; charset=UTF-8

Response headers

Access-Control-Allow-Origin
https://www.chip.de
Date
Mon, 10 Sep 2018 14:28:39 GMT
Access-Control-Allow-Credentials
true
Server
Jetty(9.4.z-SNAPSHOT)
Access-Control-Allow-Headers
Content-Type
Access-Control-Allow-Methods
POST,OPTIONS,HEAD
activeview
pagead2.googlesyndication.com/pcs/ Frame 740A
42 B
123 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsunw1ZPHZWXvOFnLbB0RtX_fwzEOfJFVkYCCyHCKBDc_EkXCHlBBarFa13VOJd9DrAqlL5iHoE5fApnk4YIx6Q-ux9CJ7UaBsM&sig=Cg0ArKJSzDmrSo7AbvZiEAE&adk=1162233392&tt=-1&bs=1585%2C1200&mtos=1069,1069,1069,1069,1069&tos=1069,0,0,0,0&p=62,308,312,1278&mcvt=1069&rs=3&ht=0&tfs=187&tls=1256&mc=1&lte=1&bas=0&bac=0&la=1&avms=geo&rst=1536589718493&rpt=323&ioa=1&mms=1&ps=1585%2C3527&ss=1600%2C1200&pt=-1&deb=1-1-7-16-16-21-54-8&tvt=1239&op=1&r=v&id=osdim&ti=1&uc=15&tgt=DIV&cl=1&cec=23&clc=1&cac=0&cd=970x250&v=r20180904
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:824::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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:39 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="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
activeview
pagead2.googlesyndication.com/pcs/ Frame 976F
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsv_ZjZKjOHOaYL8SDrTywzPdtObjz12hO4jpRY_WojmFaGFSMh4JHcdhtSr2osWvJ1Xy39Bsyhacl5xEYSOtX3pfFBTAgw2JhI&sig=Cg0ArKJSzJVZNmmebS5HEAE&adk=542669646&tt=-1&bs=1585%2C1200&mtos=1004,1004,1004,1004,1004&tos=1004,0,0,0,0&p=322,1305,922,1465&mcvt=1004&rs=3&ht=0&tfs=252&tls=1256&mc=1&lte=1&bas=0&bac=0&avms=geo&rst=1536589718673&rpt=207&ioa=1&mms=1&ps=1585%2C3527&ss=1600%2C1200&pt=-1&deb=1-1-7-16-16-21-54-8&tvt=1239&op=1&r=v&id=osdim&ti=1&uc=14&tgt=DIV&cl=1&cec=9&clc=1&cac=0&cd=160x1&v=r20180904
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:824::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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:39 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="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
rum.js
tpc.googlesyndication.com/pagead/js/r20180904/r20110914/ Frame 740A
42 KB
16 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180904/r20110914/rum.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:818::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
64d9a38c33903b30e069a71e71c855f80ce2e6d8360b50a9bfca2e5b3e3d2912
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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, 04 Sep 2018 19:00:05 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
502115
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
15946
x-xss-protection
1; mode=block
server
cafe
etag
15395581540536746001
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Tue, 18 Sep 2018 19:00:05 GMT
csi
csi.gstatic.com/ Frame 740A
0
56 B
Other
General
Full URL
https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~jlwdug3c&chm=1&ctx=2&qqid=CN76w-LSsN0CFYqv7QodYmwElQ&met.4=fb.ak~lb.fz~ol.1hl~idt.mh~dt.7&met.3=197.fx~123.fv_3~121.g0~115.k5~122.k5~118.ka_1~118.kb~118.lw~118.lz~115.n9~122.n9~118.p7_3~115.q2~122.q2~118.rz~118.t7~115.t8~122.t8~118.vy~115.w0~122.w0~118.y2~118.y3~115.yw~122.yw~118.yw~118.zs~118.117~115.11o~122.11o~118.13s~115.14g~122.14h~118.16m~115.179~122.179~118.17n~118.1ah~118.1db_1~118.1g7~117.1hl~118.1hm~113.1hz_4~112.1hy_5&met.1=1.jlwdueld~14.1g~15.1g~16.1h~17.1h~18.1h~19.1h~20.1h~21.1h~22.jj~23.jj&met.7=CBsQCiD8Ajgd~CAcQChgBIP0CKP0CMIkDOAxo_QJwgwN4-NYBgAHh1AGIAZPKBLABAbgBAw~CCIQBhgBIP8CKP8CMJIDOBNo_wJwkQN4jQKwAQG4AQM~CBsQCiDcAzg4~CBsQCiDcAzgS~CBsQBiDcAzgu~CBsQBiDcAzgu~CBsQCiDABDgJ~CBsQBiDEBTgS~CBsQBiDJBThw~CCQQBhgBIM8FKM8FMNsFOAw~CBsQBiDPBTgt~CBsQBiDRBTgg~CBsQCiDpBTiEAQ~CBsQBiCABjgM~CBsQBiCQBjgN~CBsQBiDaBjgN~CBsQBiDaBjgY~CBsQBiCCBzgM~CBsQBSCLBziTAg~CBsQBiDgBzgj~CCAQBhgBIPENKPENMIsOOBpo8Q1wiw54e4ABKogBKrABAbgBAw~CBgQChgBIIsPKIsPMJIPOAdoiw9wkQ94uX2AAcp8iAGvzQKwAQG4AQM&met.2=15.n~16.xx5
Requested by
Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/pagead/js/r20180904/r20110914/rum.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:400c:c0b::5e , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:40 GMT
last-modified
Wed, 21 Jan 2004 19:51:30 GMT
server
Golfe2
status
204
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
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
r
amp-error-reporting.appspot.com/ Frame E65B
2 B
155 B
XHR
General
Full URL
https://amp-error-reporting.appspot.com/r
Requested by
Host: cdn.ampproject.org
URL: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2014 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/ Express
Resource Hash
565339bc4d33d72817b583024112eb7f5cdf3e5eef0252d6ec1b9c9a94e12bb3

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

date
Mon, 10 Sep 2018 14:28:40 GMT
via
1.1 google
x-powered-by
Express
status
200
content-type
text/plain; charset=utf-8
access-control-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
2
activeview
pagead2.googlesyndication.com/pcs/ Frame E65B
42 B
110 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstUFVHOuuVovLpqnJ1mdwy6Ztr6-NMu3qyAxryZvWZ34fOC4QjRBXLsYCPxTFJCxJzqUV1AYLgrT3cgdXVLlBT2YN07zzA6FvY&sig=Cg0ArKJSzC-Rm07VygiiEAE&id=ampim&o=963,336&d=300,180&ss=1600,1200&bs=1600,1200&mcvt=1000&mtos=0,0,1000,1000,1000&tos=0,0,1000,0,0&tfs=132&tls=1132&g=99.99479055404663&h=99.99479055404663&r=v&pt=71&tt=1132&adk=685963231&avms=ampa
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:824::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.chip.de/downloads/Android-File-Transfer_53192185.html
User-Agent
Mozilla/5.0 (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
Mon, 10 Sep 2018 14:28:40 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
third-party-iframes.html
video.unrulymedia.com/iframes/ Frame 668F
0
0
Document
General
Full URL
https://video.unrulymedia.com/iframes/third-party-iframes.html?h=v1.0.1155-4-g960324b&siteId=1026066&gdpr=1&gdpr_consent=BOT4PvXOT4PvpAjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.71.169 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-71-169.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash

Request headers

Host
video.unrulymedia.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Accept-Encoding
gzip, deflate
Cookie
unruly_u=uid=3ACB110A977F965B8D03D32202A0FD43; uid=ChHLOluWf5ci0wONQ/2gAg==
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
X-DevTools-Emulate-Network-Conditions-Client-Id
73AD0953DAFE817D5FD0C2D060D378FC
Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html

Response headers

x-amz-id-2
JgxpZb62X5/oTfPtpXjcQft02ftspTUHzYotqIXjwC9yAZPo70YXnw3lkQoVWdY7udEICLYUcCs=
x-amz-request-id
3D7E1DE078089FC7
Last-Modified
Tue, 07 Aug 2018 11:31:02 GMT
ETag
"14c493dcffd4ce310fa513c9b978a0fe"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
389
Server
AmazonS3
Cache-Control
max-age=86349
Date
Mon, 10 Sep 2018 14:28:40 GMT
Connection
keep-alive
P3P
CP="CUR IVDo OUR IND"
r
amp-error-reporting.appspot.com/ Frame 5168
2 B
64 B
XHR
General
Full URL
https://amp-error-reporting.appspot.com/r
Requested by
Host: cdn.ampproject.org
URL: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js
Protocol
SPDY
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:819::2014 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/ Express
Resource Hash
565339bc4d33d72817b583024112eb7f5cdf3e5eef0252d6ec1b9c9a94e12bb3

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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;charset=UTF-8

Response headers

date
Mon, 10 Sep 2018 14:28:40 GMT
via
1.1 google
x-powered-by
Express
status
200
content-type
text/plain; charset=utf-8
access-control-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
2
/
364bf6be.akstat.io/
0
199 B
Other
General
Full URL
https://364bf6be.akstat.io/
Requested by
Host: s.go-mpulse.net
URL: https://s.go-mpulse.net/boomerang/DG6LL-C2K3J-45PG2-VMF2Q-KM6V9
Protocol
SPDY
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
104.108.48.32 Amsterdam, Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a104-108-48-32.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.chip.de/downloads/Android-File-Transfer_53192185.html
Origin
https://www.chip.de
User-Agent
Mozilla/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

pragma
no-cache
date
Mon, 10 Sep 2018 14:28:45 GMT
status
204
content-type
image/gif
access-control-allow-origin
https://www.chip.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
timing-allow-origin
*
x-xss-protection
0
expires
Mon, 10 Sep 2018 14:28:45 GMT

Verdicts & Comments Add Verdict or Comment

247 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| chip object| digitalData boolean| TfmediaExtFolEngineLoaded object| chip_currpage_json function| __cmp function| loadCSS function| _extends function| _typeof function| LazyLoad object| myLazyLoad boolean| isRedesignPage string| normalDlUrl string| downloadFileType boolean| downloaderAllowed boolean| downloaderDefinitelyBeingUsed object| _satellite object| queue number| rand function| writeCookie function| readCookie undefined| _sp_ undefined| script undefined| parentElem object| amznpassback function| amzn_ads object| amznads function| aax_write function| amznMatchCookie function| aax_render_ad object| cdivw string| szmvars object| OEWA object| iom object| oilJsonp object| core object| __core-js_shared__ object| global object| System function| asap function| Observable function| setImmediate function| clearImmediate object| regeneratorRuntime boolean| _babelPolyfill object| AS_OIL boolean| adtechNewLogic boolean| dealbarStatus object| _deq object| AdSystemLoader boolean| hasFEA string| playerCSS string| previewCSS string| currentPlayerCode string| adtechPageType object| currpage string| adsc_async string| adsc_ressort string| adsc_rubrik string| adsc_adunit1 string| adsc_adunit2 string| adsc_adunit3 string| adsc_adunit4 string| adsc_adunit5 string| adsc_layout string| adsc_device string| adsc_mobile string| adsc_keyword string| adsc_contentwidth string| adsc_pageid string| adsc_referrer object| mediator boolean| passiveEventSupport object| vibrantConfig object| _caq undefined| tfss_towerbanner object| style object| TFMDFP function| getContentHeight function| stickyLooper function| stickySkyscraper object| googletag object| permutive string| version function| webpackJsonp object| $scriptQueue boolean| cssLoaded boolean| previewCssLoaded boolean| TFM_adEngineHasRun object| TFM function| jsonpCallback number| timeout string| url object| promise object| header string| adsc_topchannel string| adsc_channel string| adsc_subchannel string| adsc_brand string| adsc_sw string| adsc_product object| dummyDiv function| sc_smartIntxtNoad number| index function| ads_gettag object| tfsads string| adsg_site object| adsg_inf undefined| _oldQueue object| _aeq object| google_js_reporting_queue object| google_ad_modifications boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state object| adsbygoogle function| obApi object| OBR string| OB_releaseVer function| OBR$ object| outbrain object| outbrain_rater function| generateInfolayer object| trip_c string| sidebar_target object| dmc_bd5739235da857f function| k function| m number| p function| n function| q function| r function| t function| dm_conative_prebid function| defineCallback boolean| adEngineVideoURLReady number| timestamp_burn object| _EQLService object| _EQPScript function| initiateInstaller function| forceInstaller function| useRegularLink function| $ function| jQuery function| _ string| cxops object| cdltq function| scrollListener number| BOOMR_lstart function| AppMeasurement_Module_ActivityMap function| AppMeasurement function| s_gi function| s_pgicq number| s_objectID number| s_giq object| s_c_il number| s_c_in object| optimizely string| f0 object| s_Obj string| s_PPVid function| s_PPVevent number| s_PPVi number| s_PPVt object| s_i_cxochipde-prod boolean| afterBottom object| vttjs function| WebVTT function| videojs object| f function| VideoPlayer object| pubsub object| priv function| dm_conative_main number| dm_conative_main_init object| dm_ccc_cmd object| GPT_jstiming object| closure_memoize_cache_ boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id number| google_unique_id object| gaGlobal object| players object| videoScrollspy string| publisherCMSVideoID object| vmConsentCookieFinder object| BOOMR object| BOOMR_mq function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter object| _EQPService object| _emqYL object| _emqConImpact string| ada_publisher object| _adrtx object| _emqAdexGif string| _emqstr object| naeGhaiTEikeisie number| v object| Dw object| Ew function| videopkgInterface function| InstreamapiDebug function| ois function| VASTParser function| ElementLocator function| SmartPlay function| Hammer object| VM function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| google string| adsc_mode object| closure_lm_310966 object| google_persistent_state_async number| google_global_correlator object| __google_ad_urls object| ampInaboxIframes object| ampInaboxPendingMessages boolean| google_osd_loaded boolean| google_onload_fired object| closure_lm_727080 string| ois_21C29C0D544D4928A9079BEA070B06A4 function| macroModel function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb object| AMP_CONFIG object| log object| AMPErrors boolean| ampInaboxInitialized object| AMP_MODE function| reportError object| AMP string| hic_qos number| BOOMR_configt object| _bmrEvents object| unruly number| __unrulyPageLoadId function| doAddFallback number| unruly:native-ad:nativeAdLoadedTimes number| BOOMR_onload

4 Cookies

Domain/Path Name / Value
.chip.de/ Name: s_ppv
Value: ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C34%2C34%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
.chip.de/ Name: s_ppvl
Value: ir-13725907%2520%257C%2520android%2520file%2520transfer%2520%255Bdownloads%2520%253E%2520macos%255D%2C34%2C34%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
.chip.de/ Name: RT
Value: "sl=1&ss=1536589717158&tt=8020&obo=0&bcn=%2F%2F364bf6be.akstat.io%2F&sh=1536589725181%3D1%3A0%3A8020&dm=chip.de&si=a887289a-a217-4e6b-98da-b0a30a1f235b&ld=1536589725181"
www.chip.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6IlpVKzYiLCJ0c2wiOjE1MzY1ODk3MjUsIm52IjowLCJ1cHQiOjE1MzY1ODk3MTcsImx0IjoxNTM2NTg5NzE3fV0.

8 Console Messages

Source Level URL
Text
console-api log URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js(Line 5)
Message:
oil_shown_adobe
console-api log URL: https://filestorage.chip.de/videoplayer/videoplayer.3c21256c0e9dc3aaa93f.bundle.js(Line 2)
Message:
VIDEOJS:
console-api info URL: https://cdn.conative.de/artifacts-v2/43c6f871a3c1f0d8b2e0b0441d77d17a47c6dc7a/adscript.min.js(Line 97)
Message:
conative received prebid request for adSlotId 0
console-api log URL: https://k.intellitxt.com/intellitxt/front.asp?ipid=5154(Line 65)
Message:
VM: ReloadGo with consentStr: <{%22opt_in%22:true%2C%22timestamp%22:1536589717525%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}>consentType: <oil_data>
console-api info URL: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js(Line 533)
Message:
Powered by AMP ⚡ HTML – Version 1535566825959
console-api error URL: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js(Line 96)
Message:
localStorage not supported.
console-api info URL: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js(Line 533)
Message:
Powered by AMP ⚡ HTML – Version 1535566825959
console-api error URL: https://cdn.ampproject.org/rtv/011535566825959/amp4ads-v0.js(Line 96)
Message:
localStorage not supported.

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.

364bf6be.akstat.io
a.bf-ad.net
a.bf-tools.net
aax.amazon-adsystem.com
ad-js.chip.de
ad.doubleclick.net
ad.sxp.smartclip.net
ad.yieldlab.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adtm.chip.de
ajax.googleapis.com
amp-error-reporting.appspot.com
amplify.outbrain.com
amplifypixel.outbrain.com
an.facebook.com
beacon.krxd.net
bidder.criteo.com
c.amazon-adsystem.com
c.go-mpulse.net
c1.adform.net
cdn.adrtx.net
cdn.ampproject.org
cdn.conative.de
cdn.emetriq.de
cloud-video.unrulymedia.com
cm.g.doubleclick.net
counts.yieldlab.net
csi.gstatic.com
d.adup-tech.com
d.df-srv.de
d.nativendo.de
d3alqb8vzo7fun.cloudfront.net
dco.smartclip.net
de.ioam.de
des.smartclip.net
dmp.theadex.com
dsp.adfarm1.adition.com
farm.plista.com
filestorage.chip.de
hgc-cf-cache-1.svonm.com
ib.adnxs.com
images.intellitxt.com
imasdk.googleapis.com
irqs.ioam.de
k.intellitxt.com
match.adsrvr.org
p.rfihub.com
p.yieldlab.net
pagead2.googlesyndication.com
partners.wfxtriggers.com
ps.eyeota.net
rt.chip.de
s.d.adup-tech.com
s.go-mpulse.net
s0.2mdn.net
script.ioam.de
securepubads.g.doubleclick.net
smartclip.nuggad.net
somniture.chip.de
ssl.1.damoh.chip.de
ssl.3.damoh.chip.de
ssum-sec.casalemedia.com
stats3.unrulymedia.com
sync.mathtag.com
t.myvisualiq.net
targaryen.unrulymedia.com
targeting.unrulymedia.com
tlx.3lift.com
tpc.googlesyndication.com
tr.outbrain.com
uip.semasio.net
ups.xplosion.de
vibrant.mgr.consensu.org
video.unrulymedia.com
videoembed.chip.de
videos.chip.de
widgets.outbrain.com
www.chip.de
www.google.com
www.googletagservices.com
x.bidswitch.net
xpl.theadex.com
104.108.48.32
104.109.71.169
107.178.241.34
144.76.220.226
148.251.139.104
148.251.151.243
151.101.134.2
172.217.21.194
172.217.21.198
172.217.22.2
176.34.121.0
178.250.0.93
18.153.11.28
18.185.168.60
18.194.100.124
185.29.135.233
185.31.128.129
185.33.223.197
185.33.223.220
193.46.63.75
2.18.232.233
2.18.234.190
2.18.234.21
2001:16e0:10a:1::c1:1
2001:16e0:10a:1::c2:1
2600:9000:2047:ca00:1c:8c89:a300:93a1
2600:9000:2047:fe00:9:e42d:cc80:93a1
2a00:1450:4001:818::2001
2a00:1450:4001:818::200a
2a00:1450:4001:819::2001
2a00:1450:4001:819::2006
2a00:1450:4001:819::2014
2a00:1450:4001:81e::2002
2a00:1450:4001:81f::2004
2a00:1450:4001:824::2002
2a00:1450:4001:825::200a
2a00:1450:400c:c0b::5e
2a00:cd0:1005:2:80:82:201:80
2a01:4f8:202:42d4::2
2a02:26f0:6c00:284::1142
2a02:26f0:6c00:28b::30fb
2a02:26f0:6c00:28c::bf0
2a02:26f0:6c00:28f::1142
2a02:26f0:6c00:292::30fb
2a02:26f0:6c00:2bc::bf0
2a03:2880:f01c:800e:face:b00c:0:2
31.24.80.101
34.242.119.131
34.252.16.212
35.157.25.10
37.157.6.245
46.137.113.194
46.137.126.71
52.18.166.37
52.208.127.173
52.208.52.41
52.222.146.214
52.222.147.244
52.222.150.113
52.222.150.126
52.222.150.61
52.222.150.73
52.222.150.78
52.222.153.135
52.30.15.212
52.48.133.165
52.94.220.16
54.154.14.76
54.154.209.235
54.171.22.132
54.72.140.158
63.140.40.124
64.202.112.28
77.66.11.200
85.114.144.106
85.114.144.199
85.114.159.118
85.114.159.93
91.215.100.40
91.215.103.64
027b0dddbb2d6e00584e3159aef14a2859f06a0c47621b166523e57752307a4d
02fc09402ed0eacc82a0775185d88a5c55926568767dcec0038a63da5b175cf3
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f
042b703a40f6f8e110aa580711d62180f50684859f59918ed69105cf36c08208
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0518773189fca34853eacbdd0915182e0a8942372199a109e7fb2a46e51374c9
0535c3bb3a17e4ac0fb7d29214d2181275662129dc2bdd2a89c35934e9fc5ba5
08b3d2cb0ce50558fa5981857bf280e3e590f7853d3ae33e5f6b76597f2a58bb
097041c492417db0fcdca6eb69f02c5925e29b6066acf5b8d5d460298752ee4d
09def6ea73f714a8b6f63b7ad4f7ecb708df079c893598e06966df827efb7dc4
0b83e579e58877029429493de2f98c28025164977fd48f763789f6bbab6b4e2c
0bd57dbc29c26c8db1dd5a00d5e39d294abb1ab823805458feadec8bb6fcc8b4
0ce06e90ff45dee22ede838c2cb6e3d185fc5aaa45206f15dfe1acaf9775e7e8
0d5dfd3690fb26eac90d5cfd9c75552a5f66766ed516fc5feb051bf1440bfdc4
0ddda9839c0f03c7cc800154368af8a65eeef1ad60c70559fa784d30f21b1165
0e0bd05bcb5921464af7ed4a5435e077b15175967374a3a5f96aba2247d2d864
13d01a91a2551b2330cd623855b2adcda9f371d720eb02ef3adcf3a5dbffcf6a
1bfb94c4c4ed58fa8d0c81006a568c3f4d7efc4c453c58b11115ad6cf57d8e87
1c86b047f9e6428cfbe4abc895303df8d2aad721d57136ec053476582d319226
1da1aacdf32c1154fda77c584f419812f8e0e24982786ea014ae44b85fe7bddb
1e2133170e649cfea51ed4afd733568930f2d4cc53961ed1fba84de58c2abd5b
202db84a742a669d5cea67ac16a2c432547cdeb0922422897de274e72298e17c
21cd5a7b8c2cb9345c6bfe0b17f0c8d94e997314d1400644d837d67abc723587
226c47b7d3427d9a1724333e73052536305778dce47c0f435d504f79744afd82
24c0ad02293c4d430bf9328484ea759625e1fffb5d820aa4530d592032746152
26c9c2ffd3d4ea43b62a3ac326dc386049bf49048f038e051f684dee2e4d88ca
2ac0bda221cfdc311f691f5b9fa2729efdfdb485f16e54f8089c3fc3ef50d354
2c58d4161a717be7779fc054c22883c300eb12b7556628c849c33aa104ee8ed6
30c065c5189582302f1fc91edd7f8c99956f6f8bd6c4b242081f41ab1c772b08
323b3e828035a91dc4ebbdb9a38a2220d08404131f815649f83f2be870f40b60
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
355ec6061c7818c5ac4e7d1d9cb56965255a632ba0d5fb49976d8c86024cc049
389d9ac2a9b303896c087649ef7758e2ec40acfedd1078a2216a8fd73df83bab
38ea6fa80f05fd43cbeeef4410f1cfc6cd309cff879a782519735a7585654e6c
3c46f11abb9fedf9ac6759180dfd4f443efa54aad2ca0b73efbb7e1b59aa750a
3e4882c7b6adf8be26c741c61bb4df88e4412dbc315cb734dd18cc29fc9b05c5
4007ca91f49ad2614a59d9347cfc72fba4a35abee3e8e2ab07813b64db22bc1f
409b714f0c6bd1cc832bf33ac83011cafe1e12b03e8412172275d29cf515ec65
4237fbd5c8f82cc0ae589a15643eaa4761da7287070ca74ad15cbc38316f889a
46ab33a1c2d56dc8299e8bef5c29466ae9356a4515ddd449a0bfc05aa5e84af8
480f7a2020234eb7d1f5745fbc8ec7f6535905cdeddda4a8b5d63bf6466c33c5
4ba552c11110fca501ffc26419491d101b5249a982438e0de4cfae032a782941
4e48c5d7b5ed9a46ce4bb8ce504cd2da2f350d66c342d1e5d1a8461fbc0e07cd
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
5048a2504c4315733dedf71143207a64faef50f62eea07f4d6fd1d9cdd1d99d7
50c0ac6ebe102fdb6da358a0f9b6fa2cb8ad829a776f8838babb8f0487419cdf
51a92d0800cd66f6bf20e50b043d49f2fefa9dc368ae442a57a95e10edbd63bd
525fd4bda968296354c5e6655e25a275c18146bbaf360ee1b5c1db729c94c8b6
538a73bb19a5c8a68c4c3ff31b01cc2150656c23c4f77316ddee1b2deb36c103
565339bc4d33d72817b583024112eb7f5cdf3e5eef0252d6ec1b9c9a94e12bb3
59495fbc81066e3a85739c38ba73d8724e9195f48f664e911ddbd92c64647726
59eef289b63cafa1d3889e072a1cfefa5f7bf785b525eabcf3aef0002cb5533a
5a3f1dd74233f605e511f1b5b244bedf85ac88ba264caf4d6401bc7ec2017dcd
5b58686217cec6765ea771d68b6e150c01f272e66aeb93a3bac137cb365c0810
6226d0f2e2f30bf71792b282b40113d65edc19466b895f33c2dc996409d17212
62763330432501cee46b4603a4321372108b05fbc083850bed4585f99739cf90
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f
63014e0db08db9a1ba9a35d531d3ccefa158e33f53f436142550ef0d0acd5b5f
64d9a38c33903b30e069a71e71c855f80ce2e6d8360b50a9bfca2e5b3e3d2912
6505922a9a43605568eb50ec69e4a6a36b19bec67067c67de90c27fed687e35c
66a7f220521242ab44a0f1cb8cbb4ec4422abeb057a0d1510a0a3f3ff60fb91b
670506f73688fc179c5821d61cde38f34a52bb20a32021272d6216bb88488830
694834f00526512ca65046c4b7519d2a100560cd871455f2246f0393ba567fcd
69f6ed7f178885f3442df08d55280f891b5b55d6312b459ffaa648f2fad95cec
6c2ad417bbd7492018e6d055a44ac6bbe8ba22eaadfee5f2b0bfacf14e656d22
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76a77c2946e361ce2578a6ad8cb494c43cf10222212948aab1c36f0ffc467450
77f4d860f1bb21b949f9f23ef951609331cfc2d20eabc9f6cee348fde9cf2da8
7db88358fc27c1bd55e13e06a6439e4f564a5c5bd75843413eff22a77f391c0e
80c12dda89b3ff3e58285446aea0d15c6471d320a22b02b3aa73e24a63785f89
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
85556761a8800d14ced8fcd41a6b8b26bf012d44a318866c0d81a62092efd9bf
86f0604b3e2f0617e88f739b6cfc368ace4a520e3f4044e1b22394f49abb28eb
870e27cad33d8dc47d855e12048aad477184ca7d45b5b6812f70ffc2b34b1649
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7
8778ba53b998ae44cb9a271b72c299b2bf539ac1b33ca360e7bc10253698b850
8de1e71fbe6b18721745691e4bc988068868564fcc74de2e9cdb05402d9f20eb
8eecf0a2944ad09c2017e2351de3edd35017eb94e1f3f412e4c942701f9f0687
92a1b0df334580a9784edb23c8b77fb0d9d617122cd953c4dc3c8c32b29d9f75
943e0dc9bd434fc272621a73673894ab9a32a4acc68a96809ed2da7585eee780
949a8bb15f2ab2ba00ee6c0d6689f7bfb555c873b833b626ac666602fd88d227
952f1bbc4ca6e8f2d37d4ea65956bb66d6c0761cf8a764ad70e886ea1c90951b
95f1c67bdd3a0fcd6a4aaea0916b983b178990c126296fd82f894f05bd040dca
96462e773b00c01a79cd885a78e923ea67fe8765c6d1ba38410133b222b34c71
967fc73388397671e36cab8d0d1083058881d67d7a63be24041e492628309974
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a
97f4a90cf712c7ba9c33bfa1684ca989731e94549bce7cd07d00d8bf5ead4e93
98cab46844c5321e2681b64894ea3545cf9b80d86f41400ec60d015d57b02f06
9ce0815e04e67d2dde584322db795c23301b0794797fbcd84210d49bc89ad28a
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9ed3a2ae1ef227fdc6f09c78bcc9a1e590da910c1c276f96b2aaf86d6c4a952e
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a0e44788e4f67a669b3e7f76e40ef57b5e6f5a6e647a5c68500520f58654d904
a1ecbaed793a1f564c49c671f2dd0ce36f858534ef6d26b55783a06b884cc506
a6a1913cb604f6626586e00b44f3d5a9efd6929752a59b87366d5f0ca70d39e4
a6e4b3001b9006e3c0c658a2205b83c2088388fbbd90d9a2e7a9a3657d25ab49
a821ef2e57f7a813859e0757693071df87135628c3d8f017bc499d0322afeba6
a92618a39ca0b874fe2c10608c9ccb1da20fe96cdd6ba1bee086179e3743dc22
aa7b7560ae2a84c1b82ea3606755598e7e171d827634472fa54f75743327b3ae
aa7cda73ad0fdc3ee543442599840b5182eb66f5d5fbe6cf6e9a6d44c3e5551f
aaaabde3f68c325033b37bb3ebff887e3b589b7137e717e96648a52221881429
acb5bb4213314a2c2f339557c140ffd7febc186871522dc82b0f0580f979e6c4
adb39c104018084189bf781785cfcb0ec458b3716a465201c4e53b3361e5d119
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aee550e3ea4a294b63c1da465eb0f814a806dc5b8e2ec76c0129ef72884b356f
af331e1a65a2d58fa6a41a12789e98d9a8236e972ff2d2719e5f64466fd3feb5
af71e5d84379e977c529d7f2e90751cd55d9303cd9072c934624ddc6828cf34f
afd78436d7aa99bb2eaa5072f1f455a7e00fdf53c5cd9c19921b14e1c6c39b5f
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e
b0149cebf2aabd5f085727f8d89a2e95b844f0a646c69027c32d3027694e2a69
b015b0cf826bfaa0ead29ba2dcaa3d7b32f802257b192d9518ab86ca836b5a38
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
bb806aec2acf3fad6e52d40cfa7dbbd4ebe64f99fafb1390e26993262c46f1d2
bbbfc98b4c2571bf9507e45e3e237b9e24b880748900027aed5e421f8a6fa4bc
be923a4db5597031f5e3189d0ceee2a71b4faddb7c20ed8ec90b6cbd80140a7b
c5db83fccd1ba5f75cb3c453eb4c09e0f73f79e0337edd7107441f5e9798dc0d
c927695a6166edbfb66984db84b2913dcc6da4c9af0c0072dfd3807e660cd5b6
cf00d01204e6980f758858462f84aa567e85710b1f138546535fc3788f8f1b57
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d40b5f84c921f3c3075d01ec5cebcaeea07068ed43f0ff9204381eb1e575f085
d9262cbf7f04dd3b4ba9b73a11cbd614a1e707f22317611aac9d294b20a85103
db8556e4c9fd6ef2cbf3f6802335c822229cb816980c6b0f3b16a92214f88aa2
dc87a2442d1fb08192d768befada253e79bb82af3d77c2827f260cba9ea0bf7f
dcacf94b511a1f0117435853d4ba31fead3db09fe316fb4cb476b218bb454aee
dfd9bd92ae5147930219f47fd1db6dc3de97b1287f5f453a549fc6e838abba0f
e0b8436d50fb200de76d7a25cf450ea238cd100197f8e9d462e9228153da873f
e37a88100825cf11e2592364c1fe83dfd2e28c04eb0766d2c04ce77027a771e9
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e4da1d289ab89639768b2685742ead0e6c31997e6b29d241cdcc4427998d1a64
e832be11265d7211c4d6a39727d1f1dc0deb7225138ac6bb9627df33446b8477
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f6c43322b78f17d931449a03f935d47d05b89f578fc6a62d8067b37d7fec5d8a
f7505e6aa0b337a6b561ea835262b6a45bb36848e971a6122b00bf9172f9b51c
fea76a36651a6a153f98259cd2f9b1d1da70b2c4bbccf38c3bd0606d6d35f768
ffd863adce73bcd5ecb00753cb264120d71714252835f94e336b5f2a842eb81c