Submitted URL: https://tvtoday.de/
Effective URL: https://www.tvtoday.de/
Submission: On March 18 via automatic, source alexatop100k

Summary

This website contacted 51 IPs in 8 countries across 43 domains to perform 157 HTTP transactions. The main IP is 151.106.72.75, located in Milwaukee, United States and belongs to PLUSSERVER-ASN1, DE. The main domain is www.tvtoday.de.
TLS certificate: Issued by AlphaSSL CA - SHA256 - G2 on May 3rd 2017. Valid for: 2 years.
This is the only time www.tvtoday.de was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
2 44 151.106.72.75 61157 (PLUSSERVE...)
2 23.8.13.231 20940 (AKAMAI-ASN1)
5 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
3 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 91.215.100.39 43407 (INFONLINE-AS)
1 192.229.233.4 15133 (EDGECAST)
1 2 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.103.65 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 2.18.232.130 16625 (AKAMAI-AS)
5 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
7 74.125.206.156 15169 (GOOGLE)
1 52.30.21.185 16509 (AMAZON-02)
1 216.239.36.21 15169 (GOOGLE)
2 99.86.1.198 16509 (AMAZON-02)
2 52.210.188.80 16509 (AMAZON-02)
1 178.250.0.130 44788 (ASN-CRITE...)
1 178.250.2.89 44788 (ASN-CRITE...)
25 104.109.68.123 20940 (AKAMAI-ASN1)
1 4 185.33.223.218 29990 (ASN-APPNEXUS)
1 136.243.25.85 24940 (HETZNER-AS)
1 35.190.75.210 15169 (GOOGLE)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
3 52.94.220.16 16509 (AMAZON-02)
2 52.216.170.117 16509 (AMAZON-02)
2 13.35.253.56 16509 (AMAZON-02)
1 2600:9000:200... 16509 (AMAZON-02)
1 2a00:1450:400... 15169 (GOOGLE)
1 136.243.37.233 24940 (HETZNER-AS)
1 54.77.75.246 16509 (AMAZON-02)
1 85.114.144.194 24961 (MYLOC-AS)
1 1 2001:16e0:10a... 12611 (RKOM R-KO...)
4 4 85.114.159.93 24961 (MYLOC-AS)
1 1 2001:16e0:10a... 12611 (RKOM R-KO...)
2 3 89.163.159.116 24961 (MYLOC-AS)
1 52.31.228.50 16509 (AMAZON-02)
1 34.245.249.125 16509 (AMAZON-02)
1 136.243.51.224 24940 (HETZNER-AS)
11 37.157.4.25 198622 (ADFORM)
1 3 136.243.51.134 24940 (HETZNER-AS)
1 148.251.180.141 24940 (HETZNER-AS)
6 37.157.5.73 198622 (ADFORM)
1 2 195.216.249.67 47268 (ZANOX)
1 1 85.10.231.199 24940 (HETZNER-AS)
1 78.46.71.136 24940 (HETZNER-AS)
1 54.228.202.240 16509 (AMAZON-02)
1 1 85.114.159.118 24961 (MYLOC-AS)
2 2 77.66.11.200 16245 (NGDC)
2 3 54.36.123.231 16276 (OVH)
2 2 37.252.172.42 29990 (ASN-APPNEXUS)
1 1 216.58.207.34 15169 (GOOGLE)
2 2 34.251.201.192 16509 (AMAZON-02)
1 1 37.157.6.251 ()
1 1 85.215.5.31 ()
4 4 18.153.11.13 ()
2 2 146.148.8.25 ()
1 1 193.0.160.128 ()
2 2 185.29.132.21 ()
1 136.243.21.26 24940 (HETZNER-AS)
2 2a00:1450:400... 15169 (GOOGLE)
157 51
Apex Domain
Subdomains
Transfer
48 tvtoday.de
tvtoday.de
www.tvtoday.de
images.tvtoday.de
ssl.2.damoh.tvtoday.de
ssl.3.damoh.tvtoday.de
ssl.1.damoh.tvtoday.de
987 KB
26 yieldlab.net
ad.yieldlab.net
p.yieldlab.net
counts.yieldlab.net
21 KB
18 adform.net
track.adform.net
s1.adform.net
c1.adform.net
203 KB
9 doubleclick.net
stats.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
92 KB
7 adnxs.com
acdn.adnxs.com
ib.adnxs.com
secure.adnxs.com
36 KB
6 bf-tools.net
a.bf-tools.net
emq.bf-tools.net
67 KB
5 adition.com
dsp.adfarm1.adition.com
2 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax.amazon-adsystem.com
23 KB
5 googletagservices.com
www.googletagservices.com
95 KB
4 bidswitch.net
x.bidswitch.net
3 KB
4 ad-srv.net
ad.ad-srv.net
ad18.ad-srv.net
5 KB
3 id5-sync.com
id5-sync.com
2 KB
3 theadex.com
xpl.theadex.com
dmp.theadex.com
1 KB
3 googlesyndication.com
tpc.googlesyndication.com
pagead2.googlesyndication.com
234 B
3 xplosion.de
ups.xplosion.de
uss.xplosion.de
5 KB
3 abtasty.com
try.abtasty.com
dcinfos.abtasty.com
ariane.abtasty.com
66 KB
3 ioam.de
script.ioam.de
de.ioam.de
10 KB
3 bf-ad.net
a.bf-ad.net
53 KB
2 mathtag.com
sync.mathtag.com
1 KB
2 volvelle.tech
a.volvelle.tech
926 B
2 adsrvr.org
match.adsrvr.org
835 B
2 semasio.net
uip.semasio.net
1 KB
2 zanox.com
ad.zanox.com
1 KB
2 df-srv.de
d.df-srv.de
1 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 svonm.com
hgc-cf-cache-1.svonm.com
2 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 google-analytics.com
www.google-analytics.com
17 KB
2 tvspielfilm.de
a2.tvspielfilm.de
331 KB
1 rfihub.com
p.rfihub.com
683 B
1 twiago.com
a.twiago.com
542 B
1 krxd.net
beacon.krxd.net
453 B
1 media01.eu
pb.media01.eu
1012 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 permutive.com
cdn.permutive.com
54 KB
1 uobsoe.com
uobsoe.com
354 B
1 criteo.com
bidder.criteo.com
212 B
1 criteo.net
static.criteo.net
25 KB
1 google.com
adservice.google.com
171 B
1 google.de
adservice.google.de
171 B
1 2mdn.net
s0.2mdn.net
82 KB
1 googletagmanager.com
www.googletagmanager.com
19 KB
1 kameleoon.eu
eacgkwdpqg.kameleoon.eu
157 43
Domain Requested by
24 images.tvtoday.de www.tvtoday.de
21 ad.yieldlab.net a.bf-ad.net
www.tvtoday.de
ad.yieldlab.net
19 www.tvtoday.de 1 redirects www.tvtoday.de
text
11 track.adform.net ad.yieldlab.net
s1.adform.net
www.tvtoday.de
7 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.tvtoday.de
6 s1.adform.net track.adform.net
s1.adform.net
www.tvtoday.de
5 dsp.adfarm1.adition.com 5 redirects
5 www.googletagservices.com a.bf-ad.net
securepubads.g.doubleclick.net
5 a.bf-tools.net www.tvtoday.de
a.bf-tools.net
a.bf-ad.net
4 x.bidswitch.net 4 redirects
4 counts.yieldlab.net ad.yieldlab.net
4 ib.adnxs.com 1 redirects a.bf-ad.net
3 id5-sync.com 2 redirects www.tvtoday.de
3 ad18.ad-srv.net 1 redirects www.tvtoday.de
ad18.ad-srv.net
3 aax.amazon-adsystem.com c.amazon-adsystem.com
3 a.bf-ad.net www.tvtoday.de
a.bf-ad.net
2 pagead2.googlesyndication.com www.tvtoday.de
2 sync.mathtag.com 2 redirects
2 a.volvelle.tech 2 redirects
2 match.adsrvr.org 2 redirects
2 secure.adnxs.com 2 redirects
2 uip.semasio.net 2 redirects
2 ad.zanox.com 1 redirects ad18.ad-srv.net
2 ssl.3.damoh.tvtoday.de text
2 xpl.theadex.com 2 redirects
2 d.df-srv.de 2 redirects
2 hgc-cf-cache-1.svonm.com www.tvtoday.de
text
2 s3.amazonaws.com www.tvtoday.de
text
2 ups.xplosion.de a.bf-ad.net
cdn.emetriq.de
2 c.amazon-adsystem.com a.bf-ad.net
c.amazon-adsystem.com
2 de.ioam.de 1 redirects www.tvtoday.de
2 www.google-analytics.com 1 redirects www.tvtoday.de
2 a2.tvspielfilm.de www.tvtoday.de
1 p.rfihub.com 1 redirects
1 a.twiago.com 1 redirects
1 c1.adform.net 1 redirects
1 cm.g.doubleclick.net 1 redirects
1 dmp.theadex.com www.tvtoday.de
1 beacon.krxd.net www.tvtoday.de
1 ssl.1.damoh.tvtoday.de text
1 pb.media01.eu 1 redirects
1 ad.ad-srv.net www.tvtoday.de
1 adstax-match.adrtx.net cdn.adrtx.net
1 uss.xplosion.de www.tvtoday.de
1 p.yieldlab.net www.tvtoday.de
1 cdn.adrtx.net www.tvtoday.de
1 ssl.2.damoh.tvtoday.de www.tvtoday.de
1 tpc.googlesyndication.com securepubads.g.doubleclick.net
1 cdn.emetriq.de ups.xplosion.de
1 emq.bf-tools.net a.bf-tools.net
1 cdn.permutive.com a.bf-tools.net
1 uobsoe.com www.tvtoday.de
1 bidder.criteo.com a.bf-ad.net
1 static.criteo.net a.bf-ad.net
1 ariane.abtasty.com try.abtasty.com
1 dcinfos.abtasty.com try.abtasty.com
1 adservice.google.com www.googletagservices.com
1 adservice.google.de www.googletagservices.com
1 acdn.adnxs.com a.bf-ad.net
1 try.abtasty.com www.googletagmanager.com
1 s0.2mdn.net www.tvtoday.de
1 stats.g.doubleclick.net www.tvtoday.de
1 www.googletagmanager.com www.tvtoday.de
1 eacgkwdpqg.kameleoon.eu www.tvtoday.de
1 script.ioam.de www.tvtoday.de
1 tvtoday.de 1 redirects
157 66
Subject Issuer Validity Valid
*.tvtoday.de
AlphaSSL CA - SHA256 - G2
2017-05-03 -
2019-05-04
2 years crt.sh
a2.tvspielfilm.de
DigiCert SHA2 Secure Server CA
2019-03-08 -
2020-06-06
a year crt.sh
bf-tools.net
DigiCert SHA2 Secure Server CA
2019-02-24 -
2020-05-25
a year crt.sh
*.bf-ad.net
DigiCert SHA2 Secure Server CA
2018-07-13 -
2020-01-11
a year crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.storage.kameleoon.com
DigiCert SHA2 Secure Server CA
2017-10-24 -
2020-09-01
3 years crt.sh
*.google-analytics.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.g.doubleclick.net
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.doubleclick.net
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
try.abtasty.com
Let's Encrypt Authority X3
2019-01-29 -
2019-04-29
3 months crt.sh
cdn.adnxs.com
GeoTrust RSA CA 2018
2018-11-20 -
2020-02-19
a year crt.sh
*.google.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
*.abtasty.com
Amazon
2018-10-10 -
2019-11-10
a year crt.sh
ariane.abtasty.com
Let's Encrypt Authority X3
2019-03-03 -
2019-06-01
3 months crt.sh
c.amazon-adsystem.com
Amazon
2018-12-18 -
2019-11-21
a year crt.sh
*.xplosion.de
Thawte RSA CA 2018
2018-12-10 -
2020-02-08
a year crt.sh
*.criteo.net
DigiCert SHA2 Secure Server CA
2018-11-08 -
2019-12-19
a year crt.sh
*.criteo.com
DigiCert SHA2 Secure Server CA
2018-11-05 -
2020-01-03
a year crt.sh
*.yieldlab.net
DigiCert SHA2 Secure Server CA
2018-12-12 -
2020-03-12
a year crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh
uobsoe.com
Let's Encrypt Authority X3
2019-02-26 -
2019-05-27
3 months crt.sh
*.permutive.com
DigiCert SHA2 Secure Server CA
2018-05-15 -
2019-06-19
a year crt.sh
aax-eu.amazon-adsystem.com
Amazon
2018-12-12 -
2019-12-10
a year crt.sh
s3.amazonaws.com
DigiCert Baltimore CA-2 G2
2018-12-03 -
2019-10-25
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2018-08-09 -
2019-09-09
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2019-03-01 -
2019-05-24
3 months crt.sh
ssl.1.damoh.tvtoday.de
Let's Encrypt Authority X3
2019-01-21 -
2019-04-21
3 months crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh
*.ad-srv.net
Go Daddy Secure Certificate Authority - G2
2016-05-30 -
2019-05-30
3 years crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2018-02-02 -
2019-10-02
2 years crt.sh
ad.zanox.com
Thawte RSA CA 2018
2018-01-03 -
2019-06-26
a year crt.sh
*.krxd.net
Go Daddy Secure Certificate Authority - G2
2017-06-12 -
2019-07-11
2 years crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2018-02-16 -
2019-10-19
2 years crt.sh
*.id5-sync.com
Go Daddy Secure Certificate Authority - G2
2017-04-02 -
2020-04-02
3 years crt.sh

This page contains 10 frames:

Primary Page: https://www.tvtoday.de/
Frame ID: 80B19708234470B064A8C16E49417A3E
Requests: 116 HTTP requests in this frame

Frame: https://eacgkwdpqg.kameleoon.eu/
Frame ID: B834803A9D8A82BBD40D4F666D49F75B
Requests: 1 HTTP requests in this frame

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

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

Frame: https://ad.ad-srv.net/zone/ah42n1l1ebaj
Frame ID: 9E3BAA895724C1BF6A22E27777279DB2
Requests: 6 HTTP requests in this frame

Frame: https://ad.yieldlab.net/d/27712/21691/160x600?ts=1552868825301&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Frame ID: D56784E13B599113F533CB7DE378156D
Requests: 32 HTTP requests in this frame

Frame: https://ad.zanox.com/ppv/images/onepixel.gif?foo=45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472&dyn_id=
Frame ID: A0D464F01C56999DC4DDA941336F503E
Requests: 1 HTTP requests in this frame

Frame: https://ad18.ad-srv.net/request_content.php?s=59340600006853700869841010806018&a=72863e32
Frame ID: E630CE725F5513BF58BD857D0637953D
Requests: 1 HTTP requests in this frame

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

Frame: https://ad.yieldlab.net/d/27713/21691/300x250?ts=1552868825754&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Frame ID: 10D863FA330E5AA142268346E7ECEFCB
Requests: 13 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

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

Detected technologies

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

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

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

Overall confidence: 100%
Detected patterns
  • env /^__google_ad_/i
  • env /^Goog_AdSense_/i

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

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

Overall confidence: 50%
Detected patterns
  • env /^head$/i

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

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

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

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

Page Statistics

157
Requests

100 %
HTTPS

25 %
IPv6

43
Domains

66
Subdomains

51
IPs

8
Countries

2194 kB
Transfer

5597 kB
Size

0
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. https://tvtoday.de/ HTTP 301
    http://www.tvtoday.de/ HTTP 301
    https://www.tvtoday.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 16
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2FBrandenburg&cb=000d&i2=000d9c0c86673f3c95c8ee5d7&ep=1584091236&vr=412&id=s9k4qs&i3=000d9c0c86673f3c95c8ee5d7%3A1583022423700%3A1552868823700%3A.tvtoday.de%3A1%3A1552868823700!apu0yv&n1=1&dntt=0&lt=1552868823702&ev=&cs=ehx04i&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2FBrandenburg&cb=000d&i2=000d9c0c86673f3c95c8ee5d7&ep=1584091236&vr=412&id=s9k4qs&i3=000d9c0c86673f3c95c8ee5d7%3A1583022423700%3A1552868823700%3A.tvtoday.de%3A1%3A1552868823700%21apu0yv&n1=1&dntt=0&lt=1552868823702&ev=&cs=ehx04i&mo=1&sr=71
Request Chain 19
  • https://www.google-analytics.com/r/collect?v=1&_v=j73&aip=1&a=1370797224&t=pageview&_s=1&dl=https%3A%2F%2Fwww.tvtoday.de%2F&ul=en-us&de=UTF-8&dt=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblick%20von%20TV%20TODAY&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=YEBAAEAB~&jid=811730022&gjid=1924990502&cid=1496432352.1552868824&tid=UA-1909021-1&_gid=1544185460.1552868824&_r=1&z=1369300110 HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=1496432352.1552868824&jid=811730022&_gid=1544185460.1552868824&gjid=1924990502&_v=j73&z=1369300110
Request Chain 94
  • 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=6669520818358319243 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=4575&ext_id=62688854248
Request Chain 95
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0BDJCEiJkWSJFEif-BiUABifkBSU0WsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000720170127050010&axd_pid=22&axd_fuid=BSa0BDJCEiJkWSJFEif-BiUABifkBSU0WsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D HTTP 302
  • https://uss.xplosion.de/usersync?sid=65966&fpid=1000720170127050010
Request Chain 111
  • https://ad18.ad-srv.net/request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x90&scrollPos=0x0&extData[]=&envData=&redirectClick=&documentReferer=https%3A%2F%2Fwww.tvtoday.de%2F&ancestorOrigins=https%3A%2F%2Fwww.tvtoday.de&random=6429625247374&isIframe=1&container=&adPos=0x0&adPosCheck=1x1&adtagId=0 HTTP 302
  • https://ad18.ad-srv.net/request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x90&scrollPos=0x0&extData[]=&envData=&redirectClick=&documentReferer=https%3A%2F%2Fwww.tvtoday.de%2F&ancestorOrigins=https%3A%2F%2Fwww.tvtoday.de&random=6429625247374&isIframe=1&container=&adPos=0x0&adPosCheck=1x1&adtagId=0&uidRedirect=1
Request Chain 117
  • https://ad.zanox.com/tpv/?45547756C1037577523T&zpar0=59340600006853700869841010806018 HTTP 302
  • https://pb.media01.eu/view.aspx?trackid=91C09AA007C123F60FDC6F5FD61F1F1B&dt_subid1=45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472&dt_subid2=&actionid=981742&produktid=giroextraplus&dt_url=https%3A%2F%2Fad.zanox.com%2Fppv%2Fimages%2Fonepixel.gif%3Ffoo%3D45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472 HTTP 301
  • https://ad.zanox.com/ppv/images/onepixel.gif?foo=45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472&dyn_id=
Request Chain 124
  • https://dsp.adfarm1.adition.com/cookie/?ssp=1 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=15233&ext_id=6669520818358319243
Request Chain 125
  • 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=6669520818358319243
Request Chain 126
  • 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=6669520818358319243
Request Chain 127
  • 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=6669520818358319243&sInitiator=yl HTTP 302
  • https://uip.semasio.net/adition/1/info2?sType=sync&sExtCookieId=6669520818358319243&sInitiator=yl HTTP 302
  • https://id5-sync.com/s/112/4235DA63E1225995/9.gif HTTP 302
  • https://id5-sync.com/c/112/112/9/1.gif?puid=4235DA63E1225995 HTTP 302
  • https://secure.adnxs.com/getuid?https://id5-sync.com/c/112/2/8/2.gif?puid=$UID HTTP 302
  • https://secure.adnxs.com/bounce?%2Fgetuid%3Fhttps%3A%2F%2Fid5-sync.com%2Fc%2F112%2F2%2F8%2F2.gif%3Fpuid%3D%24UID HTTP 302
  • https://id5-sync.com/c/112/2/8/2.gif?puid=4885345172670062659
Request Chain 128
  • 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=CAESELO7NN_Iso_wpHkhs5OJXLQ&google_cver=1
Request Chain 129
  • 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=4103e265-207b-4341-9e64-f29ce43bd64d
Request Chain 130
  • 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=4258007426103092333
Request Chain 131
  • https://c1.adform.net/serving/cookie/match?party=6 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=4879&ext_id=-8024436743952979522
Request Chain 132
  • https://a.twiago.com/rtb/usermatch.php?umid=1&call_type=redirect&rtbprovider=empty&redirecturl=https%3A%2F%2Fad.yieldlab.net%2Fm%3Fdt_id%3D35250%26ext_id%3D%25userid%25 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=35250&ext_id=87f18197347d01491ea6bf44e30ce225bbe2bcb4110c63027dab0603cfb18
Request Chain 133
  • https://x.bidswitch.net/sync?ssp=yieldlab HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=yieldlab HTTP 302
  • https://a.volvelle.tech/sync?ssp=bidswitch&bidswitch_ssp_id=yieldlab HTTP 302
  • https://a.volvelle.tech/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=yieldlab HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=190&expires=14&user_group=0&user_id=&ssp=yieldlab HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?dsp_id=190&expires=14&user_group=0&user_id=&ssp=yieldlab HTTP 302
  • https://ad.yieldlab.net/m?dt_id=6850&ext_id=fbe8969a-bf41-49c6-8162-41ef6241be27
Request Chain 134
  • https://p.rfihub.com/cm?pub=19593&in=1 HTTP 302
  • https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1871597490093458918
Request Chain 135
  • 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=bd405c8e-e293-4b00-bbcd-2f7b74ac98f6

157 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.tvtoday.de/
Redirect Chain
  • https://tvtoday.de/
  • http://www.tvtoday.de/
  • https://www.tvtoday.de/
908 KB
97 KB
Document
General
Full URL
https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
5aabd9fa7e1bf5a35a251ecb464bef2c3a5e36e7c636ff36479cff033e876d44

Request headers

:method
GET
:authority
www.tvtoday.de
:scheme
https
:path
/
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

status
200
date
Mon, 18 Mar 2019 00:24:03 GMT
vary
X-Forwarded-Proto,Accept-Encoding
content-type
text/html; charset=UTF-8
last-modified
Mon, 18 Mar 2019 00:24:03 GMT
cache-control
max-age=901, public
content-encoding
gzip
x-varnish
1021620379 1021750633
age
179
accept-ranges
bytes

Redirect headers

Date
Mon, 18 Mar 2019 00:27:03 GMT
Vary
X-Forwarded-Proto
Location
https://www.tvtoday.de/
Content-Length
231
Content-Type
text/html; charset=iso-8859-1
Last-Modified
Mon, 18 Mar 2019 00:27:03 GMT
Cache-Control
no-store, no-cache, must-revalidate, private
X-Varnish
386876102
Age
0
Connection
keep-alive
dfdd70c.css
www.tvtoday.de/css/
240 KB
37 KB
Stylesheet
General
Full URL
https://www.tvtoday.de/css/dfdd70c.css?8.381
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
822ad4383665cea954758d8bcc2b11f8cfcd1591df89d3a447f02ef8776a27be

Request headers

:path
/css/dfdd70c.css?8.381
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
www.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:26:15 GMT
content-encoding
gzip
last-modified
Thu, 07 Feb 2019 10:37:09 GMT
age
48
etag
"3bf57-5814b6ca7a340-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
text/css
status
200
cache-control
max-age=1209600, public
x-varnish
1021620394 1018156505
accept-ranges
bytes
channel_web_optimized.css
a2.tvspielfilm.de/images/tv/sender/mini/
22 KB
3 KB
Stylesheet
General
Full URL
https://a2.tvspielfilm.de/images/tv/sender/mini/channel_web_optimized.css
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.8.13.231 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-8-13-231.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
8e2a0000fea4e9d693f81d08162b6869398a72409ddbcedc9dbefd9f60129212
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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=15768000
Content-Encoding
gzip
Last-Modified
Wed, 13 Feb 2019 09:49:45 GMT
Server
Apache
ETag
"5733-581c3763b8833-gzip"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=1876224
Date
Mon, 18 Mar 2019 00:27:03 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3013
Expires
Mon, 08 Apr 2019 17:37:27 GMT
46cfa08.js
www.tvtoday.de/js/
16 KB
5 KB
Script
General
Full URL
https://www.tvtoday.de/js/46cfa08.js?8.381
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
2fcbe9ed682b16557f66e6fd4e7fa33b647eb54f921f4a3c37c526fb30ba45ab

Request headers

:path
/js/46cfa08.js?8.381
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:11:45 GMT
content-encoding
gzip
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
918
etag
"402e-57ab008ffeede-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
1020878240 1021549189
accept-ranges
bytes
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.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:03 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
status
200
cache-control
max-age=900
accept-ranges
bytes
expires
Mon, 18 Mar 2019 00:42:03 GMT
adengine.js
a.bf-ad.net/adengine/tvtoday/
191 KB
50 KB
Script
General
Full URL
https://a.bf-ad.net/adengine/tvtoday/adengine.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
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
9998f48bc55669d8dc39505b2b36fdf4cb5856a0ff25b55e34b1862484f7b29e

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:03 GMT
content-encoding
gzip
last-modified
Wed, 13 Mar 2019 10:11:28 GMT
server
Apache
etag
"c9fd4893fd9a775d2c6c404a38a6d306:1552471894"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
50567
expires
Mon, 18 Mar 2019 00:42:03 GMT
tfm.videopkg.min.js
www.tvtoday.de/js/
156 KB
48 KB
Script
General
Full URL
https://www.tvtoday.de/js/tfm.videopkg.min.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
b51d1d78b0c6571240135468e9881fdf232a476bcbe1c8e6c6787dfbd5570821

Request headers

:path
/js/tfm.videopkg.min.js
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:02:58 GMT
content-encoding
gzip
last-modified
Sun, 17 Mar 2019 23:45:01 GMT
age
1445
etag
"26f1f-58452dc48234b-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
1007774886 1021103002
accept-ranges
bytes
iam.js
script.ioam.de/
22 KB
8 KB
Script
General
Full URL
https://script.ioam.de/iam.js?m=1
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 000d
Resource Hash
5f35632bdd2009567cace35075eacaaab1b4e2337c0afb5b202d789c7f8ef9c4

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:03 GMT
Content-Encoding
gzip
Last-Modified
Mon, 18 Mar 2019 00:27:03 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 000d
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, 18 Mar 2019 02:27:03 GMT
tvt_logo_500x100.png
www.tvtoday.de/bundles/frontend/images/logos/
37 KB
38 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/logos/tvt_logo_500x100.png?8.381
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692

Request headers

:path
/bundles/frontend/images/logos/tvt_logo_500x100.png?8.381
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:11:45 GMT
last-modified
Fri, 02 Nov 2018 07:42:43 GMT
age
918
etag
"9557-579a9ae471290"
vary
X-Forwarded-Proto
x-varnish
1007774887 1020939426
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/png
brian-may-rami-malek-roger-taylor,208264_navigation_100.jpg
images.tvtoday.de/files/images/201903/1/
6 KB
6 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201903/1/brian-may-rami-malek-roger-taylor,208264_navigation_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
980d6fa4df75cfde06e7b860869703578ee87d973054da47e871c1549225c5d0

Request headers

:path
/files/images/201903/1/brian-may-rami-malek-roger-taylor,208264_navigation_100.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:48:40 GMT
last-modified
Wed, 13 Mar 2019 10:36:49 GMT
age
2304
etag
"1861-583f7621ba603"
vary
X-Forwarded-Proto
x-varnish
1007774889 1021380831
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
skoda-teaser-632x400,208286_navigation_100.jpg
images.tvtoday.de/files/images/201903/1/
5 KB
5 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201903/1/skoda-teaser-632x400,208286_navigation_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
2c2cae5fc5bde21218079735e70884e3c8f93abcc206017982451d05e247ca32

Request headers

:path
/files/images/201903/1/skoda-teaser-632x400,208286_navigation_100.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:28:17 GMT
last-modified
Wed, 13 Mar 2019 10:15:05 GMT
age
3527
etag
"14df-583f714594b0c"
vary
X-Forwarded-Proto
x-varnish
1007774890 1020608846
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
tvs_partner_logo.png
www.tvtoday.de/bundles/frontend/images/logos/
4 KB
5 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/logos/tvs_partner_logo.png?8.381
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c

Request headers

:path
/bundles/frontend/images/logos/tvs_partner_logo.png?8.381
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:34:22 GMT
last-modified
Wed, 18 Jul 2018 10:43:07 GMT
age
3161
etag
"1148-57143ba5eda4c"
vary
X-Forwarded-Proto
x-varnish
1021305223 1020678594
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/png
5c0fdb4d8189657f42e92083_780.jpg
images.tvtoday.de/itv/2019-03-18/
60 KB
61 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/5c0fdb4d8189657f42e92083_780.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
bda57e58dfbbcfd6573938c823862ac97cc109d9e0a16cc6c6aebda9302aeca0

Request headers

:path
/itv/2019-03-18/5c0fdb4d8189657f42e92083_780.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:04:34 GMT
last-modified
Tue, 05 Mar 2019 03:53:37 GMT
age
1349
etag
"efe1-58350d1648e4e"
vary
X-Forwarded-Proto
x-varnish
1021305224 1021609924
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
/
eacgkwdpqg.kameleoon.eu/ Frame B834
0
0
Document
General
Full URL
https://eacgkwdpqg.kameleoon.eu/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
192.229.233.4 , United States, ASN15133 (EDGECAST - MCI Communications Services, Inc. d/b/a Verizon Business, US),
Reverse DNS
Software
ECS (fcn/40DF) /
Resource Hash

Request headers

:method
GET
:authority
eacgkwdpqg.kameleoon.eu
:scheme
https
:path
/
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.tvtoday.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.tvtoday.de/

Response headers

status
200
content-encoding
br
cache-control
max-age=5400
content-type
text/html; charset=utf-8
date
Mon, 18 Mar 2019 00:27:03 GMT
etag
"5c8a321d-40659+br"
expires
Mon, 18 Mar 2019 01:57:03 GMT
last-modified
Thu, 14 Mar 2019 10:51:09 GMT
server
ECS (fcn/40DF)
vary
Accept-Encoding
x-cache
HIT
content-length
48657
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:816::200e , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
3e552578c7d450b023f2cd9d28f830be4335c3acc6c4ab6dadda0769f09e5f22
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 16 Jan 2019 20:01:45 GMT
server
Golfe2
age
2409
date
Sun, 17 Mar 2019 23:46:54 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
17543
expires
Mon, 18 Mar 2019 01:46:54 GMT
roboto-v18-latin-regular.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

:path
/bundles/frontend/fonts/roboto-v18-latin-regular.woff2
pragma
no-cache
origin
https://www.tvtoday.de
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/css/dfdd70c.css?8.381
: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.tvtoday.de/css/dfdd70c.css?8.381
Origin
https://www.tvtoday.de

Response headers

date
Sun, 17 Mar 2019 23:56:13 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
1850
etag
"3bf0-580a8ee00d4d3-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
x-varnish
1007774888 1021510205
status
200
cache-control
public, max-age=3600
accept-ranges
bytes
gtm.js
www.googletagmanager.com/
52 KB
19 KB
Script
General
Full URL
https://www.googletagmanager.com/gtm.js?id=GTM-M7SCL5
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:808::2008 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Google Tag Manager (scaffolding) /
Resource Hash
8414f5a2f16a12e666a1bd297d4542fb9228bf63a41c462736c9ef8a27274121
Security Headers
Name Value
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:03 GMT
content-encoding
br
last-modified
Fri, 15 Mar 2019 00:54:05 GMT
server
Google Tag Manager (scaffolding)
access-control-allow-origin
http://www.googletagmanager.com
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
status
200
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
cache-control
private, max-age=900
access-control-allow-credentials
true
access-control-allow-headers
Cache-Control
content-length
19181
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:03 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2FBrandenburg&cb=000...
  • https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2FBrandenburg&cb=000...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2FBrandenburg&cb=000d&i2=000d9c0c86673f3c95c8ee5d7&ep=1584091236&vr=412&id=s9k4qs&i3=000d9c0c86673f3c95c8ee5d7%3A1583022423700%3A1552868823700%3A.tvtoday.de%3A1%3A1552868823700%21apu0yv&n1=1&dntt=0&lt=1552868823702&ev=&cs=ehx04i&mo=1&sr=71
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0028
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:03 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0028
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Mon, 18 Mar 2019 00:27:03 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 0028
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, 18 Mar 2019 00:27:03 GMT
Server
nginx
Location
/tx.io?st=tvspielf&cp=D%2FT%2FR%2FH%2FW%2F-%2F-%2FThema_Entertainment_tvtoday&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.tvtoday.de&xy=1600x1200x24&lo=DE%2FBrandenburg&cb=000d&i2=000d9c0c86673f3c95c8ee5d7&ep=1584091236&vr=412&id=s9k4qs&i3=000d9c0c86673f3c95c8ee5d7%3A1583022423700%3A1552868823700%3A.tvtoday.de%3A1%3A1552868823700%21apu0yv&n1=1&dntt=0&lt=1552868823702&ev=&cs=ehx04i&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Sun, 18 Mar 2018 00:27:03 GMT
truncated
/
43 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Response headers

Content-Type
image/gif
roboto-v18-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-v18-latin-700.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97

Request headers

:path
/bundles/frontend/fonts/roboto-v18-latin-700.woff2
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv
origin
https://www.tvtoday.de
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/css/dfdd70c.css?8.381
: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.tvtoday.de/css/dfdd70c.css?8.381
Origin
https://www.tvtoday.de

Response headers

date
Sun, 17 Mar 2019 23:48:50 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
2294
etag
"3c4c-580a8ee00bd67-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
x-varnish
1021002637 1021353244
status
200
cache-control
public, max-age=3600
accept-ranges
bytes
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://www.google-analytics.com/r/collect?v=1&_v=j73&aip=1&a=1370797224&t=pageview&_s=1&dl=https%3A%2F%2Fwww.tvtoday.de%2F&ul=en-us&de=UTF-8&dt=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberbli...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=1496432352.1552868824&jid=811730022&_gid=1544185460.1552868824&gjid=1924990502&_v=j73&z=1369300110
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=1496432352.1552868824&jid=811730022&_gid=1544185460.1552868824&gjid=1924990502&_v=j73&z=1369300110
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c04::9c , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

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

Redirect headers

pragma
no-cache
date
Mon, 18 Mar 2019 00:27:03 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1909021-1&cid=1496432352.1552868824&jid=811730022&_gid=1544185460.1552868824&gjid=1924990502&_v=j73&z=1369300110
content-type
text/html; charset=UTF-8
status
302
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
418
expires
Fri, 01 Jan 1990 00:00:00 GMT
ima3.js
s0.2mdn.net/instream/html5/
239 KB
82 KB
Script
General
Full URL
https://s0.2mdn.net/instream/html5/ima3.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/tfm.videopkg.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:821::2006 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
50178c2908dd13de5a387ee5e197029dd5aa0c24692fb2360c54b7484d03d75d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
83498
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:03 GMT
hub.html
a.bf-tools.net/cmp/ Frame 8610
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
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash

Request headers

:method
GET
:authority
a.bf-tools.net
:scheme
https
:path
/cmp/hub.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.tvtoday.de/
accept-encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.tvtoday.de/

Response headers

status
200
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, 18 Mar 2019 00:42:03 GMT
date
Mon, 18 Mar 2019 00:27:03 GMT
content-length
5299
e635b173ecc8f02410500ddfa1c8b793.js
try.abtasty.com/
269 KB
65 KB
Script
General
Full URL
https://try.abtasty.com/e635b173ecc8f02410500ddfa1c8b793.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-M7SCL5
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:29e::1eae , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
fa36d2f4799a846aeea4079c7cdf207ce1ffd27cb1314a9204b6778e70668252

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:03 GMT
content-encoding
gzip
last-modified
Wed, 19 Dec 2018 11:58:57 GMT
etag
"d29d568fa037bfd15ab0333be1425412"
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
status
200
cache-control
private, max-age=30
accept-ranges
bytes
timing-allow-origin
*
content-length
66565
truncated
/
427 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
bf6433080882816ede69d3317d486fa7fd2b63995f0e3bc7971465221e058c99

Request headers

Response headers

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

Request headers

Response headers

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

Request headers

Response headers

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

Request headers

Response headers

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

Request headers

Response headers

Content-Type
image/svg+xml
roboto-condensed-v16-latin-700.woff2
www.tvtoday.de/bundles/frontend/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.tvtoday.de/bundles/frontend/fonts/roboto-condensed-v16-latin-700.woff2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6

Request headers

:path
/bundles/frontend/fonts/roboto-condensed-v16-latin-700.woff2
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1
origin
https://www.tvtoday.de
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/css/dfdd70c.css?8.381
: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.tvtoday.de/css/dfdd70c.css?8.381
Origin
https://www.tvtoday.de

Response headers

date
Mon, 18 Mar 2019 00:00:00 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:19 GMT
age
1623
etag
"3b94-580a8ee00a5f0-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
x-varnish
1021849798 1021451384
status
200
cache-control
public, max-age=3600
accept-ranges
bytes
ast.js
acdn.adnxs.com/ast/
87 KB
30 KB
Script
General
Full URL
https://acdn.adnxs.com/ast/ast.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.232.130 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-130.deploy.static.akamaitechnologies.com
Software
nginx/1.13.10 /
Resource Hash
29fe06bb2e99792d95a10cc599d53241dffa8ebb049529463d1377b3853ca18c

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
Content-Encoding
gzip
Last-Modified
Wed, 20 Feb 2019 19:39:29 GMT
Server
nginx/1.13.10
ETag
"5c6dacf1-15a62"
Vary
Accept-Encoding
Content-Type
application/javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=86402
Connection
keep-alive
Content-Length
30640
Expires
Tue, 19 Mar 2019 00:27:06 GMT
gpt.js
www.googletagservices.com/tag/js/
32 KB
11 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/adengine/tvtoday/adengine.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
3a80b900c538dce6ded080e90ee6a3e25c9264181192f962dc62959412020681
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"110 / 163 of 1000 / last-modified: 1552592184"
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="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
10800
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:04 GMT
truncated
/
1 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9ce49a6036072f670176d60dfcd39ccfb8458af1f72af91cf028ef7d8c81570a

Request headers

Response headers

Content-Type
image/svg+xml
neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
www.tvtoday.de/files/images/201711/2/
15 KB
15 KB
Image
General
Full URL
https://www.tvtoday.de/files/images/201711/2/neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378

Request headers

:path
/files/images/201711/2/neu-tvt-titel-neutral-11-2017,188926_issuemainimage_20.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:20:04 GMT
last-modified
Fri, 24 Nov 2017 21:12:05 GMT
age
420
etag
"3a72-55ec101392411"
vary
X-Forwarded-Proto
x-varnish
1018157107 1021685277
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
www.tvtoday.de/files/images/201901/2/
4 KB
4 KB
Image
General
Full URL
https://www.tvtoday.de/files/images/201901/2/tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9

Request headers

:path
/files/images/201901/2/tv-today-scheine-75euro-mit-stoerer,206997_issueproductimage_100.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:11:46 GMT
last-modified
Tue, 29 Jan 2019 11:05:01 GMT
age
918
etag
"1013-58096c3c68a2d"
vary
X-Forwarded-Proto
x-varnish
1020878258 1021742682
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
2b652e5.js
www.tvtoday.de/js/
25 KB
8 KB
Script
General
Full URL
https://www.tvtoday.de/js/2b652e5.js?8.381
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
22f138e2189f2659b3f920aaf4cb81963493984091199acf38dbb3db7be3235d

Request headers

:path
/js/2b652e5.js?8.381
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:22:33 GMT
content-encoding
gzip
last-modified
Thu, 15 Nov 2018 08:42:47 GMT
age
271
etag
"6449-57ab008ffd773-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=1209600, public
x-varnish
1018157108 1021908524
accept-ranges
bytes
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.tvtoday.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:808::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.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.tvtoday.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81f::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.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
104
x-xss-protection
1; mode=block
pubads_impl_319.js
securepubads.g.doubleclick.net/gpt/
160 KB
57 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
74.125.206.156 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
wk-in-f156.1e100.net
Software
sffe /
Resource Hash
cf65e308f1c461e06038b45d5bfa27689e22241f6b673b7d540d35cdd0ca4c32
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 07 Mar 2019 16:13: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="46,44,43,39"
content-length
58724
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:04 GMT
geolocAndWeather.php
dcinfos.abtasty.com/
189 B
409 B
Script
General
Full URL
https://dcinfos.abtasty.com/geolocAndWeather.php?chID=e635b173ecc8f02410500ddfa1c8b793&weather=false&dmp=false&vID=19031800270412132&callback=DCInfosCallback
Requested by
Host: try.abtasty.com
URL: https://try.abtasty.com/e635b173ecc8f02410500ddfa1c8b793.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.30.21.185 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-30-21-185.eu-west-1.compute.amazonaws.com
Software
Apache /
Resource Hash
99ef19af14fb27bec3b68c815d921454cfa00cfe14ba94f5f01dce32896d8d00
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubdomains;

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
Server
Apache
Connection
keep-alive
Content-Length
189
Strict-Transport-Security
max-age=31536000; includeSubdomains;
Content-Type
application/javascript
/
ariane.abtasty.com/
43 B
238 B
Other
General
Full URL
https://ariane.abtasty.com/
Requested by
Host: try.abtasty.com
URL: https://try.abtasty.com/e635b173ecc8f02410500ddfa1c8b793.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
216.239.36.21 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
any-in-2415.1e100.net
Software
/
Resource Hash
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:04 GMT
via
1.1 google
access-control-allow-origin
*
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
status
200
cache-control
must-revalidate, no-cache, private
x-appengine-log-flush-count
0
access-control-allow-headers
Content-Type
content-length
43
live-tv-small.svg
www.tvtoday.de/bundles/frontend/images/
14 KB
3 KB
Image
General
Full URL
https://www.tvtoday.de/bundles/frontend/images/live-tv-small.svg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
5c4e12a94c9666b7892be28c3945c2d47b74fb45dbb8399aab3520fc9aa9b08e

Request headers

:path
/bundles/frontend/images/live-tv-small.svg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/css/dfdd70c.css?8.381
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/css/dfdd70c.css?8.381
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:48:53 GMT
content-encoding
gzip
last-modified
Mon, 17 Oct 2016 07:06:33 GMT
age
2291
etag
"39b2-53f0a375237c5-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
image/svg+xml
status
200
cache-control
max-age=1209600, public
x-varnish
1007774891 1021381006
accept-ranges
bytes
truncated
/
698 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
d7414b3a412e2829b3c6a846fbf3038ee39bb472d77fba00a79632d41c2fea88

Request headers

Response headers

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

Request headers

Response headers

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

Request headers

Response headers

Content-Type
image/svg+xml
sprite_web_optimized_1550051384.png
a2.tvspielfilm.de/images/tv/sender/mini/
327 KB
327 KB
Image
General
Full URL
https://a2.tvspielfilm.de/images/tv/sender/mini/sprite_web_optimized_1550051384.png
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.8.13.231 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a23-8-13-231.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
47477b1178b46d92a83dde21b73232675ef517ffccef425ac61f4fdc64a7578a
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

Referer
https://a2.tvspielfilm.de/images/tv/sender/mini/channel_web_optimized.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

Strict-Transport-Security
max-age=15768000
Last-Modified
Wed, 13 Feb 2019 09:49:45 GMT
Server
Apache
ETag
"51b53-581c3763b844a"
Content-Type
image/png
Cache-Control
max-age=142221
Date
Mon, 18 Mar 2019 00:27:04 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
334675
Expires
Tue, 19 Mar 2019 15:57:25 GMT
truncated
/
298 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7a2e7a80d7542d5e8ae0beeb3abd52a5f0346c99cca5ffa4c0f222699abfe64d

Request headers

Response headers

Content-Type
image/svg+xml
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
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 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
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
2388
expires
Mon, 18 Mar 2019 00:42:04 GMT
0.1.1.33-BF-RELEASE.chunk.js
a.bf-tools.net/cmp/
35 KB
9 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
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
1bfb94c4c4ed58fa8d0c81006a568c3f4d7efc4c453c58b11115ad6cf57d8e87

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 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
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
9442
expires
Mon, 18 Mar 2019 00:42:04 GMT
config.js
www.tvtoday.de/app/js/
735 B
503 B
Script
General
Full URL
https://www.tvtoday.de/app/js/config.js?8.381
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/2b652e5.js?8.381
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
3ee079327ca98fa867616dbc2388dda9b94848b8fe7c945ff97374f29c3a219d

Request headers

:path
/app/js/config.js?8.381
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:16:28 GMT
content-encoding
gzip
last-modified
Wed, 30 Jan 2019 08:45:24 GMT
age
636
etag
"2df-580a8ee544fb4-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=1209600, public
x-varnish
1021305233 1020942397
accept-ranges
bytes
cHi6YEEqu2NoJN5-mache-meal-86,369486_artikel_100.jpg
images.tvtoday.de/files/images/272509/7/
68 B
292 B
Image
General
Full URL
https://images.tvtoday.de/files/images/272509/7/cHi6YEEqu2NoJN5-mache-meal-86,369486_artikel_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

:path
/files/images/272509/7/cHi6YEEqu2NoJN5-mache-meal-86,369486_artikel_100.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:04 GMT
last-modified
Mon, 18 Mar 2019 00:27:04 GMT
age
0
vary
Accept-Encoding
content-type
image/png
status
200
cache-control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private
x-varnish
1021620416
accept-ranges
bytes
expires
0
apstag.js
c.amazon-adsystem.com/aax2/
66 KB
19 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/apstag.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.86.1.198 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-86-1-198.fra6.r.cloudfront.net
Software
Server /
Resource Hash
06042f6ac2063c8e23fcce2c7c64449bae470d34c4d46f97e145242158ef15f3

Request headers

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

Response headers

Date
Sun, 17 Mar 2019 16:37:18 GMT
Content-Encoding
gzip
Server
Server
Age
28185
ETag
179e41b046d5f974d2586d066c70d87e
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 d5fb859c39a16d7f218b4c7fb1528ad6.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
Connection
keep-alive
Accept-Ranges
bytes
X-Amz-Cf-Id
68-EgS38lxPZ2MBARvxnfk83kNjevPg113GDIqN5Na1hCojYffwmJA==
de.js
a.bf-tools.net/de/
4 KB
2 KB
Script
General
Full URL
https://a.bf-tools.net/de/de.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
1540c430a85d4b953a5992f3ea0f0c7fc1e3220972ec1326e6379b289bb364c2

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
content-encoding
gzip
last-modified
Wed, 20 Feb 2019 11:22:50 GMT
server
Apache
etag
"db666877f6d2257ac1ec55ee55195ca6:1550661772"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
1769
expires
Mon, 18 Mar 2019 00:42:04 GMT
bfa_infolayer_styles.css
a.bf-ad.net/packages/info-layer/tvtoday/
2 KB
717 B
Stylesheet
General
Full URL
https://a.bf-ad.net/packages/info-layer/tvtoday/bfa_infolayer_styles.css
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
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
1556e80f2449b238ae34da15f72fb533d48e51c91463d21e0f8ac92d1687dff6

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
content-encoding
gzip
last-modified
Wed, 05 Sep 2018 14:03:35 GMT
server
Apache
etag
"eb9353742de2bca13880fbf7eb188773:1536156216"
vary
Accept-Encoding
content-type
text/css
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
513
expires
Mon, 18 Mar 2019 00:42:04 GMT
bfa_infolayer.js
a.bf-ad.net/packages/info-layer/tvtoday/
8 KB
2 KB
Script
General
Full URL
https://a.bf-ad.net/packages/info-layer/tvtoday/bfa_infolayer.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
H2
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
990d396de690cd1ab62d91422f1e9d486cd37f4ac44d65b56b731c57f9824595

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
content-encoding
gzip
last-modified
Thu, 14 Mar 2019 15:31:05 GMT
server
Apache
etag
"92bac1424cf9c6d5282d1ccd52cd3b0e:1552577466"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=900
accept-ranges
bytes
content-length
2230
expires
Mon, 18 Mar 2019 00:42:04 GMT
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/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.210.188.80 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-210-188-80.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
02e7bffef726df712252d19c16336c993b5494611f5d352a044be1c0e4906c19

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1543
publishertag.js
static.criteo.net/js/ld/
83 KB
25 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.0.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
b0e82f9ce6c1510f32a8e18c9581ba6573b6988dabdd3f2ed6c1ba08eff85cb9

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:04 GMT
Content-Encoding
gzip
Last-Modified
Thu, 07 Mar 2019 13:26:35 GMT
Server
nginx
ETag
W/"5c811c0b-14ca7"
Transfer-Encoding
chunked
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400, public
Connection
keep-alive
Timing-Allow-Origin
*
Expires
Tue, 19 Mar 2019 00:27:04 GMT
cdb
bidder.criteo.com/
0
212 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?profileId=208&cb=1681661774662
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, RSA, AES_256_CBC
Server
178.250.2.89 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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.tvtoday.de
Date
Mon, 18 Mar 2019 00:27:04 GMT
Access-Control-Allow-Credentials
true
Server
Finatra
Timing-Allow-Origin
*
Vary
Origin
27714,487232,2355071,487851,2456130
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/27714,487232,2355071,487851,2456130?json=true&ts=1406642831549&t=permutive%3Dnull&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:04 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.tvtoday.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, 17 Mar 2019 00:27:04 GMT
prebid
ib.adnxs.com/ut/v3/
166 B
1 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.218 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
784f74aeb09cf67166da8d9d4af4f74d171f56b6fe6aa04637c8e287e68579bf
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:06 GMT
X-Proxy-Origin
83.143.245.187; 83.143.245.187; 313.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.50:80
AN-X-Request-Uuid
a7a92bf5-9035-440f-a728-31013506ed7e
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.tvtoday.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
166
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
910147,910148
ad.yieldlab.net/yp/
2 B
756 B
XHR
General
Full URL
https://ad.yieldlab.net/yp/910147,910148?json=true&ts=4268231861612
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:04 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.tvtoday.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, 17 Mar 2019 00:27:04 GMT
main.js
www.tvtoday.de/app/js/
321 KB
100 KB
Script
General
Full URL
https://www.tvtoday.de/app/js/main.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/2b652e5.js?8.381
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
6b80a1405a50545516934837dd11f58a29aa0bf2a352638ab6df4b6a3af0afca

Request headers

:path
/app/js/main.js
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/; oil_data={%22opt_in%22:true%2C%22timestamp%22:1552868824637%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}}; tvt_session=1
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:19:41 GMT
content-encoding
gzip
last-modified
Tue, 05 Mar 2019 10:06:20 GMT
age
443
etag
"50454-5835606565bca-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=1209600, public
x-varnish
1021849803 1018152089
accept-ranges
bytes
cHi6YEEqu2NoJN5GZocJMISLMNbYmZ5KzoqmY7QB2bsyRonTbr5DPsoxm5RKtVOZxDN.png
uobsoe.com/img/adbutler/
68 B
354 B
Image
General
Full URL
https://uobsoe.com/img/adbutler/cHi6YEEqu2NoJN5GZocJMISLMNbYmZ5KzoqmY7QB2bsyRonTbr5DPsoxm5RKtVOZxDN.png
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.25.85 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
api.addefend.com
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:04 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
private, must-revalidate
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
68
Expires
-1
c8c3489e-f329-40e8-bcfc-1f852e512b01-web.js
cdn.permutive.com/
225 KB
54 KB
Script
General
Full URL
https://cdn.permutive.com/c8c3489e-f329-40e8-bcfc-1f852e512b01-web.js
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/de/de.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.190.75.210 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
210.75.190.35.bc.googleusercontent.com
Software
UploadServer /
Resource Hash
d87b4767c3740f29fce25054a43403b4656b2a476702546228982b62358287c1

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:26:28 GMT
content-encoding
gzip
age
36
status
200
x-guploader-uploadid
AEnB2UqTyFpj8z2m6X7tcJVOhXU1nHiWagC2TC0L51uDbpxFsZJBAzJX8u6CzniR2n7_4LFny0RIoELM4A0tf-nT5T6u1-68Tw
x-goog-storage-class
MULTI_REGIONAL
x-goog-metageneration
1
x-goog-stored-content-encoding
gzip
alt-svc
clear
content-length
55217
last-modified
Fri, 15 Mar 2019 09:37:53 GMT
server
UploadServer
etag
"a43277407ef241d90036ad603786967c"
vary
Accept-Encoding
x-goog-hash
crc32c=TDje0w==, md5=pDJ3QH7yQdkANq1gN4aWfA==
x-goog-generation
1552642673491376
cache-control
max-age=300, public
x-goog-stored-content-length
55217
accept-ranges
bytes
content-type
application/javascript
expires
Mon, 18 Mar 2019 00:31:28 GMT
data
emq.bf-tools.net/
68 B
263 B
XHR
General
Full URL
https://emq.bf-tools.net/data?url=https://www.tvtoday.de/&referrer=&ua_lang=en-US&user_agent=Mozilla%2F5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&sid=91628
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/de/de.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:18b::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx/1.12.1 /
Resource Hash
be921d2261f5f97c8261f65a578929adfd0e4a0143f2d8cb123757dcd95e0265

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

Response headers

Access-Control-Allow-Origin
*
Date
Mon, 18 Mar 2019 00:27:04 GMT
Server
nginx/1.12.1
Connection
keep-alive
Content-Length
68
Content-Type
text/plain; charset=utf-8
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
99.86.1.198 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-99-86-1-198.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e

Request headers

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

Response headers

Date
Sun, 17 Mar 2019 19:04:20 GMT
Content-Encoding
gzip
Vary
Origin
Age
19365
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Fri, 24 Aug 2018 07:13:51 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET
Content-Type
application/javascript
Via
1.1 d357d5d597708d2b41e0fea397aa2620.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
X-Amz-Cf-Id
l_fh5KZknbCHjpvF-lNKsxIsRHwUDKjw4oqj6n6obvNUH6tp7v4EIA==
bid
aax.amazon-adsystem.com/e/dtb/
47 B
343 B
XHR
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3128&u=https%3A%2F%2Fwww.tvtoday.de%2F&pid=312978533611552868824781&cb=8366133354701552868824791&ws=1600x1200&v=7.27.00&t=500&slots=%5B%7B%22sd%22%3A%22adsd_banner_1305497331%22%2C%22s%22%3A%5B%22728x90%22%2C%22800x250%22%2C%22970x250%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdpre=1&gdprc=BOdlPp2OdlPp3AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA&gdprl=%7B%22status%22%3A%22success%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.220.16 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
2e8be3db490ca247b8e122884af0656339a4acf8066b5e5e32663ef7e3fa1ef6

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

Response headers

Date
Mon, 18 Mar 2019 00:27:04 GMT
Server
Server
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
47
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/app/js/main.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.170.117 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Mon, 18 Mar 2019 00:27:06 GMT
Last-Modified
Sun, 17 Mar 2019 18:34:04 GMT
Server
AmazonS3
x-amz-request-id
5023C2D37BE02A24
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
EtZrE67P1jUODIL9TGELTpMF5Fjyv0VIZ3hgKI7hLHs0lM3WqE1sHCtCNaLQkvWfUvgX+CRAY5E=
Expires
0
homad_clienConfig.json
www.tvtoday.de/js/
298 B
374 B
XHR
General
Full URL
https://www.tvtoday.de/js/homad_clienConfig.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/app/js/main.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
91992bdf0daf1087fc919e76ce021bed4b012ac6f55002a482ea806461427398

Request headers

:path
/js/homad_clienConfig.json
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/; oil_data={%22opt_in%22:true%2C%22timestamp%22:1552868824637%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}}; tvt_session=1
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 22:54:01 GMT
content-encoding
gzip
last-modified
Tue, 29 May 2018 07:01:21 GMT
age
5583
etag
"12a-56d52cd41a52c-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/json
status
200
cache-control
public, max-age=7200
x-varnish
1021305234 1020405490
accept-ranges
bytes
5c63db338189653649847e56_780.jpg
images.tvtoday.de/itv/2019-03-18/
45 KB
46 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/5c63db338189653649847e56_780.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
4a11c08c6b7d91b62dee33bb90d77d6d66cad424efc987dc58293438238dbfe6

Request headers

:path
/itv/2019-03-18/5c63db338189653649847e56_780.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:44:00 GMT
last-modified
Sat, 09 Mar 2019 03:23:28 GMT
age
2585
etag
"b472-583a0dced7270"
vary
X-Forwarded-Proto
x-varnish
1021305235 1020748515
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
hawaii-gross,208290_tl_100.jpg
images.tvtoday.de/files/images/201903/1/
37 KB
37 KB
Image
General
Full URL
https://images.tvtoday.de/files/images/201903/1/hawaii-gross,208290_tl_100.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
4c4d3fdd3e31ec7a3811940e30551d9ebb0b85d907a9d82e0a659c6059e1fa35

Request headers

:path
/files/images/201903/1/hawaii-gross,208290_tl_100.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:04:46 GMT
last-modified
Wed, 13 Mar 2019 10:23:48 GMT
age
1338
etag
"9207-583f7338a2fb3"
vary
X-Forwarded-Proto
x-varnish
1021527460 1020704796
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
config.json
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
242 B
907 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.tvtoday.de/config.json
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/app/js/main.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.56 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-56.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
9be147cf6c17fa19d98c59640f3c87f7141a82bf3c94355498759bc067c3fd73

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

Response headers

Date
Mon, 18 Mar 2019 00:27:06 GMT
Via
1.1 d5fb859c39a16d7f218b4c7fb1528ad6.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Cache
RefreshHit from cloudfront
Connection
keep-alive
Content-Length
242
Last-Modified
Tue, 27 Nov 2018 09:06:38 GMT
Server
AmazonS3
ETag
"5e123adb22ac267044e36c3e0756e2c5"
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
qE5JqRpVg_IVmhCqK3HBBhm4FcknWk0DPwii04qr8Mwn0gPE-nNV7Q==
Expires
0
StickySearchController.js
www.tvtoday.de/app/js/components/header/
404 B
480 B
Script
General
Full URL
https://www.tvtoday.de/app/js/components/header/StickySearchController.js
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/js/2b652e5.js?8.381
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967

Request headers

:path
/app/js/components/header/StickySearchController.js
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/; oil_data={%22opt_in%22:true%2C%22timestamp%22:1552868824637%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}}; tvt_session=1
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:18:12 GMT
content-encoding
gzip
last-modified
Thu, 20 Dec 2018 07:17:40 GMT
age
533
etag
"194-57d6eed0ecd72-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/javascript
status
200
cache-control
public, max-age=1209600
x-varnish
1021305236 1017668334
accept-ranges
bytes
27712,487831
ad.yieldlab.net/yp/
145 B
2 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/27712,487831?json=true&ts=5917542805887&t=permutive%3Dnull&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
b8f9041c9ccce47a551ea5223261dba12d749655f9e86aa6bfc81f0416e3ee90

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

Response headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:05 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.tvtoday.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
131
Expires
Sun, 17 Mar 2019 00:27:05 GMT
prebid
ib.adnxs.com/ut/v3/
165 B
1 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.218 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
b80a1c2830a3da9b32e26e266726d6533bcfeeaeee092b37a20913b13981dbce
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:06 GMT
X-Proxy-Origin
83.143.245.187; 83.143.245.187; 313.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.27:80
AN-X-Request-Uuid
2e99f199-d36d-42e0-8d51-a9106d14bd8c
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.tvtoday.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
165
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
910144
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/910144?json=true&ts=3957912695721
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:04 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.tvtoday.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, 17 Mar 2019 00:27:04 GMT
bid
aax.amazon-adsystem.com/e/dtb/
47 B
343 B
XHR
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3128&u=https%3A%2F%2Fwww.tvtoday.de%2F&pid=312978533611552868824781&cb=1942321742511552868824861&ws=1600x1200&v=7.27.00&t=500&slots=%5B%7B%22sd%22%3A%22adsd_desktop_skyscraper_top_2058094782%22%2C%22s%22%3A%5B%22160x600%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdpre=1&gdprc=BOdlPp2OdlPp3AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA&gdprl=%7B%22status%22%3A%22success%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.220.16 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
fd03032845b23862ead920e257497d958f6bf1bc9c2b8285a0397d8c68c8c0e4

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

Response headers

Date
Mon, 18 Mar 2019 00:27:04 GMT
Server
Server
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
47
p.min.js
cdn.emetriq.de/adp/profiling/0.2.1/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:200d:f000:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d

Request headers

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

Response headers

date
Thu, 13 Dec 2018 13:56:26 GMT
content-encoding
gzip
last-modified
Thu, 13 Dec 2018 13:47:28 GMT
server
AmazonS3
age
8159439
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
hiWj6aE8JHqtrvyMwCZ_m8sYL51hXzoR
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
M66QSDHmUBpUF47etr32TTS8IIo6XHo30g9E3Qg0uGgMmfyPLLX-mA==
via
1.1 41903dc3828cdce2b3daa3c944827b92.cloudfront.net (CloudFront)
56e84100ea60e528dc56f22d_159.jpg
images.tvtoday.de/itv/2019-03-17/
3 KB
3 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/56e84100ea60e528dc56f22d_159.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a3d655eba58032b49685afe642464c7f99a47796da8779e287df104d9e4833c4

Request headers

:path
/itv/2019-03-17/56e84100ea60e528dc56f22d_159.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:50:48 GMT
last-modified
Mon, 04 Mar 2019 03:52:07 GMT
age
2177
etag
"b96-5833cae2e5cd7"
vary
X-Forwarded-Proto
x-varnish
1018157147 1020683624
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
5c5aaca581896536497a0a71_159.jpg
images.tvtoday.de/itv/2019-03-17/
4 KB
4 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/5c5aaca581896536497a0a71_159.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
c88d4572cd3aba5bd8e3f77dd064e567d9930b5705ff064f799e23ff27dc0acc

Request headers

:path
/itv/2019-03-17/5c5aaca581896536497a0a71_159.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:03:57 GMT
last-modified
Mon, 04 Mar 2019 03:49:28 GMT
age
1388
etag
"eb1-5833ca4bc1b32"
vary
X-Forwarded-Proto
x-varnish
1021399107 1020689930
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
57d66777f033af5c8b3cc0a1_159.jpg
images.tvtoday.de/itv/2019-03-17/
4 KB
4 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/57d66777f033af5c8b3cc0a1_159.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
9bd4590052d32b30481265f9aa5f69f47c7de0a47e8e13ec3aea75d758412daf

Request headers

:path
/itv/2019-03-17/57d66777f033af5c8b3cc0a1_159.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:20:20 GMT
last-modified
Mon, 04 Mar 2019 03:47:01 GMT
age
405
etag
"1073-5833c9bf6a782"
vary
X-Forwarded-Proto
x-varnish
387483421 385797942
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
5769c655f033af19dad9add1_159.jpg
images.tvtoday.de/itv/2019-03-17/
3 KB
3 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/5769c655f033af19dad9add1_159.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
ab55684011cfa46d3f5e819857e193747a32e8ba443cc8b89d4003dd50ca92d2

Request headers

:path
/itv/2019-03-17/5769c655f033af19dad9add1_159.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:41:42 GMT
last-modified
Mon, 04 Mar 2019 03:56:36 GMT
age
2723
etag
"c0e-5833cbe37d8e3"
vary
X-Forwarded-Proto
x-varnish
1021849813 1021413009
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
579703aff033af73a205e92c_159.jpg
images.tvtoday.de/itv/2019-03-17/
5 KB
5 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/579703aff033af73a205e92c_159.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
0aba76a13c2dc036f64b51ea80744ef352d44691bdca03fd9159e293d55ddd93

Request headers

:path
/itv/2019-03-17/579703aff033af73a205e92c_159.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Sun, 17 Mar 2019 23:52:25 GMT
last-modified
Mon, 04 Mar 2019 03:57:17 GMT
age
2079
etag
"1233-5833cc0ab41fd"
vary
X-Forwarded-Proto
x-varnish
384490780 386395665
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
58a47462f033af03f720c7c3_159.jpg
images.tvtoday.de/itv/2019-03-17/
4 KB
4 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/58a47462f033af03f720c7c3_159.jpg
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
221b5b41caa4e3c443fcb5d2464e87bd75b365977d4d9ba22f2c3f27d5240c00

Request headers

:path
/itv/2019-03-17/58a47462f033af03f720c7c3_159.jpg
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:03:16 GMT
last-modified
Mon, 04 Mar 2019 03:56:03 GMT
age
1429
etag
"10f5-5833cbc4816e0"
vary
X-Forwarded-Proto
x-varnish
1021972177 1021513003
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
ads
securepubads.g.doubleclick.net/gampad/
19 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3470837276508905&correlator=3769879664791710&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&json_a=1&eid=21061864%2C21062378%2C21063066%2C21063159%2C21063202&vrg=319&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu_parts=3673%2Ctvt_digital%2Chomepage&enc_prev_ius=%2F0%2F1%2F2%2C%2F0%2F1%2F2&prev_iu_szs=728x90%7C970x90%7C800x250%7C970x250%7C728x90%7C800x250%2C160x600%7C350x600&prev_scp=tfs_usr%3D1%26tile%3D1%26site%3Dtvt%26lay%3Dhomepage%26tgrp%3D5%26skv%3D1%26tfww%3D78910111213141516%26mobile%3Dfalse%26device%3Ddesktop%26category%3Dhome%26pn%3DV0000P0000D0000T0000%26bfrev%3DS1301R0100L0100K0000%26pos%3Ddban1%26rl_seq%3D1%26sm%3Dsticky%2Cd%2Ch%2Ct1%2Cr0%2Cdis%2Cdis1%2Cd_hor%2Ch1%26cimp%3D1%26consent%3DBOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_tvt%252Cc_desktop%7Ctfs_usr%3D1%26tile%3D2%26site%3Dtvt%26lay%3Dhomepage%26tgrp%3D5%26skv%3D1%26tfww%3D78910111213141516%26mobile%3Dfalse%26device%3Ddesktop%26category%3Dhome%26pn%3DV0000P0000D0000T0000%26bfrev%3DS1301R0100L0100K0000%26hb_f%3Dsky%26hb_p%3D200%26hb_c%3D27712%26hb_v%3Dyieldlab%26hb_id%3Dw50o4juroHm6Bk5f%26pos%3Ddsky1%26rl_seq%3D1%26sm%3Dd%2Ct2%2Cr0%2Cdis%2Cnat%2Cdis2%2Cnat1%2Cd_oop%2Coop1%26cimp%3D1%26consent%3DBOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_tvt%252Cc_desktop&eri=5&cookie_enabled=1&bc=15&abxe=1&lmt=1552868643&dt=1552868825324&dlt=1552868823448&idt=1067&frm=20&biw=1585&bih=1200&oid=3&adxs=309%2C1315&adys=170%2C305&adks=3503556956%2C2148447601&ucis=1%7C2&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.tvtoday.de%2F&dssz=52&icsg=53608339735491&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=984x90%7C160x600&msz=990x90%7C160x600&blev=1&bisch=1&ga_vid=1496432352.1552868824&ga_sid=1552868825&ga_hid=1370797224&fws=4%2C4
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
74.125.206.156 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
wk-in-f156.1e100.net
Software
cafe /
Resource Hash
1efd8ab2a1f424622cd7b18c157fb6d369a5a9b4fab6d263dc370a7ff0227095
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.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

date
Mon, 18 Mar 2019 00:27:05 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2,-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
6201
x-xss-protection
1; mode=block
google-lineitem-id
4491429000,4382713419
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138217101952,138208078500
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.tvtoday.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_319.js
securepubads.g.doubleclick.net/gpt/
67 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
74.125.206.156 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
wk-in-f156.1e100.net
Software
sffe /
Resource Hash
c11b9a046106f278a5fb5411e95c1ba5d6f06daf9e4bfa98da51c523e4157388
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 07 Mar 2019 16:13: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="46,44,43,39"
content-length
25393
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:05 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-32/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-32/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:815::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

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

Response headers

27713,90771,5197818
ad.yieldlab.net/yp/
277 B
2 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/27713,90771,5197818?json=true&ts=8369050159025&t=adp_rtt%3Deuu%2Ce114%2Ce117%26permutive%3Dnull&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
5d0b1a0361d7a2702f537cd8f319b4fec6ccc98846154947e116bf9371555a3e

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

Response headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:05 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.tvtoday.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
180
Expires
Sun, 17 Mar 2019 00:27:05 GMT
prebid
ib.adnxs.com/ut/v3/
166 B
1 KB
XHR
General
Full URL
https://ib.adnxs.com/ut/v3/prebid
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
185.33.223.218 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
001d751111062119cbdf69e62f97ba43a204b72feef82bb11e119c5c595c9c7c
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:07 GMT
X-Proxy-Origin
83.143.245.187; 83.143.245.187; 313.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.10:80
AN-X-Request-Uuid
9274e580-f18c-4eb9-a35d-7abbbae6625c
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.tvtoday.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
166
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
910145,910146
ad.yieldlab.net/yp/
2 B
1 KB
XHR
General
Full URL
https://ad.yieldlab.net/yp/910145,910146?json=true&ts=1181350034114
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:05 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.tvtoday.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, 17 Mar 2019 00:27:05 GMT
bid
aax.amazon-adsystem.com/e/dtb/
47 B
343 B
XHR
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3128&u=https%3A%2F%2Fwww.tvtoday.de%2F&pid=312978533611552868824781&cb=5820983142451552868825345&ws=1600x1200&v=7.27.00&t=500&slots=%5B%7B%22sd%22%3A%22adsd_desktop_rectangle_single_any_1855240545%22%2C%22s%22%3A%5B%22300x250%22%2C%22300x600%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdpre=1&gdprc=BOdlPp2OdlPp3AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA&gdprl=%7B%22status%22%3A%22success%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.94.220.16 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
a94b21a79845154ed7ba59416e5e0cc38f3749512fb8a43234ba5319ba6b24d3

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

Response headers

Date
Mon, 18 Mar 2019 00:27:05 GMT
Server
Server
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
47
/
ssl.2.damoh.tvtoday.de/36d0846ab0bca4c4ab1c6c98bea1015ae6e697ee/
203 KB
55 KB
XHR
General
Full URL
https://ssl.2.damoh.tvtoday.de/36d0846ab0bca4c4ab1c6c98bea1015ae6e697ee/
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/app/js/main.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.37.233 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.233.37.243.136.clients.your-server.de
Software
AmazonS3 /
Resource Hash
82e749665c7912ccff1cd83d97600274bf39815363ef0b6cc95d5fc5a9475dc1

Request headers

Pragma
no-cache
Origin
https://www.tvtoday.de
Accept-Encoding
gzip, deflate, br
Host
ssl.2.damoh.tvtoday.de
User-Agent
Mozilla/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.tvtoday.de/
Connection
keep-alive
Content-Length
118
Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:05 GMT
Content-Encoding
gzip
Connection
keep-alive
Content-Length
55815
Last-Modified
Wed, 13 Mar 2019 12:39:05 GMT
Server
AmazonS3
Vary
Accept-Encoding, Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/javascript; charset=UTF-8
Access-Control-Allow-Origin
https://www.tvtoday.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
Access-Control-Allow-Credentials
true
X-Homad-Instance
de20-homad-3
X-Homad-Url
https://hgc-cf-cache-1.svonm.com/hd-main.js
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Das%20aktuelle%20Fernsehprogramm%20im%20%C3%9Cberblick%20von%20TV%20TODAY&hostSiteUrl=https%3A%2F%2Fwww.tvtoday.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&event_id=page_view&_sid=91628&_ver=0.2.1&_seg=jsonp&_=685328619692
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.1/p.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.210.188.80 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-210-188-80.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
75246a1e61827f8f7c48f4586e087796203774f2682a0c265b1a31673e782a55

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 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
1581
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.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.75.246 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-75-246.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.7 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

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

Response headers

Date
Sun, 17 Mar 2019 08:23:16 GMT
Content-Encoding
gzip
Last-Modified
Sun, 17 Mar 2019 08:23:00 GMT
Server
akka-http/10.1.7
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
m
p.yieldlab.net/
0
471 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=23666&ext_id=BSa0BDJCEiJkWSJFEif-BiUABifkBSU0WsfABifABifABfrr&ddata_seg=e0
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
85.114.144.194 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
lb.yieldlab.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 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, 17 Mar 2019 00:27:05 GMT
m
ad.yieldlab.net/
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=6669520818358319243
  • https://ad.yieldlab.net/m?dt_id=4575&ext_id=62688854248
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=4575&ext_id=62688854248
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 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, 17 Mar 2019 00:27:05 GMT

Redirect headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:25:04 GMT
Server
nginx
Vary
Accept
P3P
CP="Contact Impact does not have a P3P policy.
Location
https://ad.yieldlab.net/m?dt_id=4575&ext_id=62688854248
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Type
text/plain; charset=utf-8
Content-Length
77
Expires
0
usersync
uss.xplosion.de/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa0BDJCEiJkWSJFEif-BiUABifkBSU0WsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000720170127050010&axd_pid=22&axd_fuid=BSa0BDJCEiJkWSJFEif-BiUABifkBSU0WsfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3...
  • https://uss.xplosion.de/usersync?sid=65966&fpid=1000720170127050010
42 B
832 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=1000720170127050010
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.31.228.50 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-31-228-50.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
42

Redirect headers

status
302
date
Mon, 18 Mar 2019 00:27:05 GMT
access-control-allow-credentials
true
server
nginx
p3p
CP="CAO PSA OUR"
location
https://uss.xplosion.de/usersync?sid=65966&fpid=1000720170127050010
content-type
text/html; charset=UTF-8
activation
adstax-match.adrtx.net/ Frame F1D1
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
34.245.249.125 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
akka-http/10.1.7 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.tvtoday.de/
Accept-Encoding
gzip, deflate, br
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.tvtoday.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Mon, 18 Mar 2019 00:27:05 GMT
Server
akka-http/10.1.7
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
truncated
/
203 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
82e749665c7912ccff1cd83d97600274bf39815363ef0b6cc95d5fc5a9475dc1

Request headers

Response headers

Content-Type
text/javascript
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=3470837276508905&correlator=3769879664791710&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fifs&adsid=NT&json_a=1&eid=21061864%2C21062378%2C21063066%2C21063159%2C21063202&vrg=319&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A32776&sc=1&sfv=1-0-32&iu_parts=3673%2Ctvt_digital%2Chomepage&enc_prev_ius=%2F0%2F1%2F2&prev_iu_szs=320x50%7C300x250%7C300x600%7C400x200%7C1x1%7C99x99%7C1x6&fluid=height&prev_scp=tfs_usr%3D1%26tile%3D3%26site%3Dtvt%26lay%3Dhomepage%26tgrp%3D5%26skv%3D1%26tfww%3D78910111213141516%26mobile%3Dfalse%26device%3Ddesktop%26category%3Dhome%26pn%3DV0000P0000D0000T0000%26bfrev%3DS1301R0100L0100K0000%26hb_f%3Dmr%26hb_p%3D200%26hb_c%3D27713%26hb_v%3Dyieldlab%26hb_id%3DRXhnZRB9JUPgm3h0%26pos%3Ddmr1%26rl_seq%3D1%26sm%3Dnat%2Cd%2Cv%2Ct3%2Cr0%2Cdis%2Cdis3%2Cnat2%2Cd_ver%2Cv1%26cimp%3D1%26consent%3DBOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA%26excl_cat%3Dbl_tvt%252Cc_desktop&eri=5&cookie_enabled=1&bc=15&abxe=1&lmt=1552868643&dt=1552868825761&dlt=1552868823448&idt=1067&frm=20&biw=1585&bih=1200&oid=3&adxs=965&adys=1143&adks=3668077323&ucis=5&ifi=4&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.tvtoday.de%2F&dssz=63&icsg=53608339735491&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=328x250&msz=312x250&blev=1&bisch=1&ga_vid=1496432352.1552868824&ga_sid=1552868825&ga_hid=1370797224&fws=4
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
74.125.206.156 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
wk-in-f156.1e100.net
Software
cafe /
Resource Hash
bc8145c2ba10f812785e1dc461da00c2592b8939a95699b8870e4bd7da8c04a5
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.tvtoday.de/
Origin
https://www.tvtoday.de

Response headers

date
Mon, 18 Mar 2019 00:27:06 GMT
content-encoding
br
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
2428
x-xss-protection
1; mode=block
google-lineitem-id
4382652951
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138208046728
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.tvtoday.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ah42n1l1ebaj
ad.ad-srv.net/zone/ Frame 9E3B
9 KB
3 KB
Script
General
Full URL
https://ad.ad-srv.net/zone/ah42n1l1ebaj
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.51.224 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
Apache /
Resource Hash
965da6de11a4974a588ced6376b8d14f2bbc50c0b71fd828c3116bc9b78260b5

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
Content-Encoding
gzip
Server
Apache
Connection
close
Content-Length
2579
Vary
Accept-Encoding
Content-Type
text/html; charset=UTF-8
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 9E3B
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29080
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:05 GMT
osd.js
www.googletagservices.com/activeview/js/current/
75 KB
27 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
ea8709c333523eaa79e47d2670f5bbb49c469bf52de4d4c5d4b83571ec14da65
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
27825
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:05 GMT
160x600
ad.yieldlab.net/d/27712/21691/ Frame D567
1 KB
2 KB
Script
General
Full URL
https://ad.yieldlab.net/d/27712/21691/160x600?ts=1552868825301&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7181a1b250d59ed460bac1f8266cf4a71f09c61b04b05d115f85b65b60a70d55

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Language
de-DE
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
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
863
Expires
Sun, 17 Mar 2019 00:27:05 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame D567
77 KB
28 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29080
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:05 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 9E3B
0
261 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsu4O8597N4W0b8VpunL1TSmx7QlKv5-iGhu3rQzXF1NeFc_wzWa7t2gKO-7RBEUZHkYQ9eNKdegCxjLCN9RlujLVmjwsEHEdRJ0oXDWjNTuX0D4mgKpY18xxwgklhzN5nlV4unH6FcXSMhpvbhExT1ckU4GzAQPeUjcvNRC53u1G1nEq6BGlwBleSJpFAP2pyD729KJ3jtbqIN-ICMAo0hcXYi_J65fGiU2oIiXPWxipJzbObKVF_RDgZ951QqFTUO8XA10_PNF2WqbM58LTmDhIM8Js8se&sai=AMfl-YQwLbb22He9kgv7mzFpU1g5cwCWzE_H6eBRgcCIc9CLFFAjaXS6GsMr4QUMzwHrFNl-jwZEY50yzc1lS50F2QSLh9DzlX1uiOJcpRlT&sig=Cg0ArKJSzAEz1vq8hcboEAE&urlfix=1&adurl=
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
74.125.206.156 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
wk-in-f156.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.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:05 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame D567
0
259 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssOIkUPtxTn2wYWypjUt6jHPujRuNflIAKuSlYW0Qck5ZZuG8i-NI19fL2rU0Xg8wkgCw2ZWOh-7ESemrJgrfbZX4PmY0Furmk1NIor05Qt-4R-c7WvR_-36J_OPJgaQv64uaXNuBxiFyE00l9Acw4CAp4ipbD3NnGsYX8E0rC-Gjd771AaHHPmN75FSh13qLR33kmvgP8plicVS8tyIwsxGc0-ic84CJSQfguJBJ--Wzh-2p6isJ2ZW1HsmEdeD-qKGhXfN_DjdQ&sai=AMfl-YSWbF0yk85fBf3E0GXdv6-3hyEPgbVO0pLZFetyhbsNzxiCDcc8BnBWMnPgsS4DIFQsx9bDK_T2UmD2jjfNRlEeoNkxkM_TKrfhsU8m&sig=Cg0ArKJSzHMqnC25wABXEAE&urlfix=1&adurl=
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
74.125.206.156 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
wk-in-f156.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.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:05 GMT
/
track.adform.net/adfscript/ Frame D567
20 KB
10 KB
Script
General
Full URL
https://track.adform.net/adfscript/?bn=28999662;rtbwp=2.0;rtbdata=vzB8uL8iSYCYOuySptf0MlMML11tIWZxlvVdYMMTe3EIH3ODpUbFIAe9vlaKmsguXqInUZd6Omj8eX8d_GOG6_RPhuwD0ITOVSmet1wuRhS1jyt10yFCA4pEsjGOlwJc65oIO3sJpiLPh184sS_bJ6RHO9qy59mNwb8y4cbJGqqrwYdhe-1wFGFwyqMUtzwtGBN47w9GBI57YVxq5O07ubpYSXCx1r_WjU161wOQ4OGQE5rFF4E7UMpj28Ie8fU18m0Q2bxtWIL1Z9eJkIHLr7B_k6PTZltdLq7ICLInLsC9KJwDPdWax1eUuojBguzFZ2P-Lt-mbKvjC-TW_aZ09JPsdx2lr8S-gah0A5feet8_zoEf-rDa9K3Nimj0-8As0WAW1LOz1C63GTp4t9ZR7Ca3osDQ9G2dw3iI60gHGBc1
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27712/21691/160x600?ts=1552868825301&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
6183084e0dd1f27cdee54267d943b02a256226bfc96c0b1b38aee9dad0f03922

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
9918
expires
-1
ve
counts.yieldlab.net/ Frame D567
0
360 B
Image
General
Full URL
https://counts.yieldlab.net/ve?d=ODE9ZSY2Mjg1Mjg4NjgyNTUxPXN0JmJjMTg5NThlMjk0YS1jYThhLWJlMzQtOWVjMS0yZmFjMjc4MT1kaXQmMj12
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27712/21691/160x600?ts=1552868825301&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 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, 17 Mar 2019 00:27:05 GMT
imp
counts.yieldlab.net/ Frame D567
0
360 B
Image
General
Full URL
https://counts.yieldlab.net/imp?s=21691&d=5210280&a=27712&ts=1552868825826&tid=1872caf2-1ce9-43eb-a8ac-a492e85981cb&l=0
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27712/21691/160x600?ts=1552868825301&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 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, 17 Mar 2019 00:27:05 GMT
2x2
ad.yieldlab.net/d/6846326/766/ Frame D567
3 KB
2 KB
Script
General
Full URL
https://ad.yieldlab.net/d/6846326/766/2x2?ts=731080731
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27712/21691/160x600?ts=1552868825301&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
9a9652ae43c223bce750767dec9e20a0aa367db811bc2648726f5dab37418267

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Language
de-DE
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
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
1059
Expires
Sun, 17 Mar 2019 00:27:05 GMT
m
ad.yieldlab.net/ Frame D567
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/27712/21691/160x600?ts=1552868825301&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:05 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, 17 Mar 2019 00:27:05 GMT
request.php
ad18.ad-srv.net/ Frame 9E3B
Redirect Chain
  • https://ad18.ad-srv.net/request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x9...
  • https://ad18.ad-srv.net/request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x9...
2 KB
1 KB
Script
General
Full URL
https://ad18.ad-srv.net/request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x90&scrollPos=0x0&extData[]=&envData=&redirectClick=&documentReferer=https%3A%2F%2Fwww.tvtoday.de%2F&ancestorOrigins=https%3A%2F%2Fwww.tvtoday.de&random=6429625247374&isIframe=1&container=&adPos=0x0&adPosCheck=1x1&adtagId=0&uidRedirect=1
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.51.134 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
Apache /
Resource Hash
926e92bce6accb3a396d84c31824c1b88df2cde50353887afc0d1b8166f375ca

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 GMT
Content-Encoding
gzip
Server
Apache
Vary
Accept-Encoding
P3P
CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Cache-Control
no-store, no-cache, must-revalidate, max-age=0
X-NEORY-SubId
59340600006853700869841010806018
Connection
close
Content-Type
application/x-javascript; charset=utf-8
Content-Length
700
Expires
Mon, 18 Mar 2019 00:27:06 +0100

Redirect headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:05 GMT
Server
Apache
P3P
CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Location
request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x90&scrollPos=0x0&extData[]=&envData=&redirectClick=&documentReferer=https%3A%2F%2Fwww.tvtoday.de%2F&ancestorOrigins=https%3A%2F%2Fwww.tvtoday.de&random=6429625247374&isIframe=1&container=&adPos=0x0&adPosCheck=1x1&adtagId=0&uidRedirect=1
Cache-Control
no-store, no-cache, must-revalidate, max-age=0
Connection
close
Content-Type
text/html; charset=UTF-8
Content-Length
0
Expires
Mon, 18 Mar 2019 00:27:05 +0100
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=6675217679
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.216.170.117 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Mon, 18 Mar 2019 00:27:06 GMT
Last-Modified
Sun, 17 Mar 2019 18:34:04 GMT
Server
AmazonS3
x-amz-request-id
295A8A0EFB324C97
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
nfU1UtTITO3rVF5JLaoi6Am29NO/3edF1UXTr5e73KIcnucrPWg+ENwt3kiSyw1UuTjeMgzag0M=
Expires
0
homad_clienConfig.json
www.tvtoday.de/js/
298 B
364 B
XHR
General
Full URL
https://www.tvtoday.de/js/homad_clienConfig.json?cache=2542973678
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
91992bdf0daf1087fc919e76ce021bed4b012ac6f55002a482ea806461427398

Request headers

:path
/js/homad_clienConfig.json?cache=2542973678
pragma
no-cache
cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/; oil_data={%22opt_in%22:true%2C%22timestamp%22:1552868824637%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}}; tvt_session=1; adp_segs=e0; __gads=ID=5252ca2d077782dd:T=1552868825:S=ALNI_MZ3zkLugEqf1tGKdUJRMHwlBZU2sQ
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
last-modified
Tue, 29 May 2018 07:01:21 GMT
age
0
etag
"12a-56d52cd41a52c-gzip"
vary
X-Forwarded-Proto,Accept-Encoding
content-type
application/json
status
200
cache-control
public, max-age=7200
x-varnish
1020834356
accept-ranges
bytes
config.json
hgc-cf-cache-1.svonm.com/www.tvtoday.de/
242 B
900 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.tvtoday.de/config.json?cache=9733796038
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.35.253.56 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-35-253-56.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
9be147cf6c17fa19d98c59640f3c87f7141a82bf3c94355498759bc067c3fd73

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

Response headers

Date
Mon, 18 Mar 2019 00:27:05 GMT
Via
1.1 d5fb859c39a16d7f218b4c7fb1528ad6.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
242
Last-Modified
Tue, 27 Nov 2018 09:06:38 GMT
Server
AmazonS3
ETag
"5e123adb22ac267044e36c3e0756e2c5"
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
zB1lKpDj_Beu2zCsfTzLZ1zuL9o5Ft097nGJjHlk4T1UCwhccR5eqA==
Expires
0
/
ssl.3.damoh.tvtoday.de/2e7fdb7e404203c96aefb6c9c934611a3c65d7ea/
242 B
1 KB
XHR
General
Full URL
https://ssl.3.damoh.tvtoday.de/2e7fdb7e404203c96aefb6c9c934611a3c65d7ea/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
148.251.180.141 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
AmazonS3 /
Resource Hash
9be147cf6c17fa19d98c59640f3c87f7141a82bf3c94355498759bc067c3fd73

Request headers

Pragma
no-cache
Origin
https://www.tvtoday.de
Accept-Encoding
gzip, deflate, br
Host
ssl.3.damoh.tvtoday.de
User-Agent
Mozilla/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.tvtoday.de/
Connection
keep-alive
Content-Length
89
Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:06 GMT
Connection
keep-alive
Content-Length
242
Last-Modified
Tue, 27 Nov 2018 09:06:38 GMT
Server
AmazonS3
Etag
"5e123adb22ac267044e36c3e0756e2c5"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.tvtoday.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
de21-homad-3
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.tvtoday.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
bootstrap.js
s1.adform.net/stoat/615/s1.adform.net/ Frame D567
31 KB
14 KB
Script
General
Full URL
https://s1.adform.net/stoat/615/s1.adform.net/bootstrap.js
Requested by
Host: track.adform.net
URL: https://track.adform.net/adfscript/?bn=28999662;rtbwp=2.0;rtbdata=vzB8uL8iSYCYOuySptf0MlMML11tIWZxlvVdYMMTe3EIH3ODpUbFIAe9vlaKmsguXqInUZd6Omj8eX8d_GOG6_RPhuwD0ITOVSmet1wuRhS1jyt10yFCA4pEsjGOlwJc65oIO3sJpiLPh184sS_bJ6RHO9qy59mNwb8y4cbJGqqrwYdhe-1wFGFwyqMUtzwtGBN47w9GBI57YVxq5O07ubpYSXCx1r_WjU161wOQ4OGQE5rFF4E7UMpj28Ie8fU18m0Q2bxtWIL1Z9eJkIHLr7B_k6PTZltdLq7ICLInLsC9KJwDPdWax1eUuojBguzFZ2P-Lt-mbKvjC-TW_aZ09JPsdx2lr8S-gah0A5feet8_zoEf-rDa9K3Nimj0-8As0WAW1LOz1C63GTp4t9ZR7Ca3osDQ9G2dw3iI60gHGBc1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.5.73 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
9bf28f6cc36bd0a6e167ff8b916c07b5f23fc702b70ba0bd6d0e67582ebd20fd

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
last-modified
Tue, 05 Mar 2019 09:52:41 GMT
server
nginx
access-control-allow-origin
*
x-cache-status
HIT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=100000
expires
Tue, 19 Mar 2019 04:13:28 GMT
onepixel.gif
ad.zanox.com/ppv/images/ Frame A0D4
Redirect Chain
  • https://ad.zanox.com/tpv/?45547756C1037577523T&zpar0=59340600006853700869841010806018
  • https://pb.media01.eu/view.aspx?trackid=91C09AA007C123F60FDC6F5FD61F1F1B&dt_subid1=45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472&dt_subid2=&actionid=981742&prod...
  • https://ad.zanox.com/ppv/images/onepixel.gif?foo=45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472&dyn_id=
0
0
Document
General
Full URL
https://ad.zanox.com/ppv/images/onepixel.gif?foo=45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472&dyn_id=
Requested by
Host: ad18.ad-srv.net
URL: https://ad18.ad-srv.net/request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x90&scrollPos=0x0&extData[]=&envData=&redirectClick=&documentReferer=https%3A%2F%2Fwww.tvtoday.de%2F&ancestorOrigins=https%3A%2F%2Fwww.tvtoday.de&random=6429625247374&isIframe=1&container=&adPos=0x0&adPosCheck=1x1&adtagId=0&uidRedirect=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
195.216.249.67 , France, ASN47268 (ZANOX, FR),
Reverse DNS
Software
Microsoft-IIS/7.5 / ASP.NET
Resource Hash

Request headers

Host
ad.zanox.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.tvtoday.de/
Accept-Encoding
gzip, deflate, br
Cookie
zttpvc=5C227047S2542520083994217472T0II5C32142S2542520083994217472T0II45547756C0SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472; zptpvc=5C227047S2542520083994217472T0II5C32142S2542520083994217472T0II45547756C0SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.tvtoday.de/

Response headers

Content-Type
image/gif
Last-Modified
Thu, 04 May 2000 17:04:38 GMT
Accept-Ranges
bytes
ETag
"09764d4eab5bf1:0"
Server
Microsoft-IIS/7.5
X-Powered-By
ASP.NET
P3P
policyref="http://ad.zanox.com/w3c/p3p.xml", CP="NOI CUR OUR STP"
jobs-at-zanox
https://www.zanox.com/jobs/international
Date
Mon, 18 Mar 2019 00:27:05 GMT
Content-Length
43
Via
10.30.0.114%1
Vary
Accept-Encoding

Redirect headers

Cache-Control
no-cache, must-revalidate
Pragma
no-cache
Content-Type
text/html; charset=UTF-8
Expires
Mon, 26 Jul 1997 05:00:00 GMT
Last-Modified
Mon, 18 Mar 2019 01:26:59 GMT
Location
https://ad.zanox.com/ppv/images/onepixel.gif?foo=45547756C1037577523SV1yq06142958029443945561209034486264yb5yb7T2542520083994217472&dyn_id=
Server
Microsoft-IIS/8.5
Set-Cookie
ASP.NET_SessionId=s2dkbrggv2tlcvdufowdlyv3; path=/; HttpOnly DTU=E7A949BAC24802CD4B9C21476DEE6CB4; expires=Thu, 18-Mar-2021 00:26:59 GMT; path=/
P3P
policyref="https://pb.media01.eu/pb.media01.eu/p3p.xml", CP="NOI NID PSA OUR BUS NAV STA"
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Access-Control-Allow-Methods
GET,POST
Access-Control-Allow-Headers
Content-Type, Content-Range, Content-Disposition, Content-Description, X-XSRF-TOKEN, X-Location
X-AspNet-Version
4.0.30319
X-Powered-By
ASP.NET
Date
Mon, 18 Mar 2019 00:26:59 GMT
Content-Length
0
request_content.php
ad18.ad-srv.net/ Frame E630
0
0
Document
General
Full URL
https://ad18.ad-srv.net/request_content.php?s=59340600006853700869841010806018&a=72863e32
Requested by
Host: ad18.ad-srv.net
URL: https://ad18.ad-srv.net/request.php?zone=ah42n1l1ebaj&nw=14&renderingType=javascript&namespace=c9d36cdcae&subid=&uid=f07f5c3ec6c42047&screenSize=1600x1200&screenSizeAvail=1600x1200&clientSize=728x90&scrollPos=0x0&extData[]=&envData=&redirectClick=&documentReferer=https%3A%2F%2Fwww.tvtoday.de%2F&ancestorOrigins=https%3A%2F%2Fwww.tvtoday.de&random=6429625247374&isIframe=1&container=&adPos=0x0&adPosCheck=1x1&adtagId=0&uidRedirect=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.51.134 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
Apache /
Resource Hash

Request headers

Host
ad18.ad-srv.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.tvtoday.de/
Accept-Encoding
gzip, deflate, br
Cookie
kdb0xdq3ls8m_uid=18055cb747a7d189
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.tvtoday.de/

Response headers

Date
Mon, 18 Mar 2019 00:27:06 GMT
Server
Apache
Cache-Control
no-store, no-cache, must-revalidate, max-age=0
Expires
Mon, 18 Mar 2019 00:27:06 +0100
Pragma
no-cache
P3P
CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Vary
Accept-Encoding
Content-Encoding
gzip
Content-Length
7368
Connection
close
Content-Type
text/html; charset=utf-8
/
track.adform.net/wpf/v2/kda44j1c.lY5BNvcKyAdMUDFBpBeA0fUm7qKFz0Xnj3wMvsD7z5meTuCUMz_WMXdMYGzXJJIneGffLMC7EZ3QHPBirTYKUowRslzRQqwSM2VHqwodv.numypZHgfLMC7AeLd7FmrpwoNN5uQ4s5uQ1szHVyVxFAk.rpwoNJ9z4oYY... Frame D567
5 KB
3 KB
Script
General
Full URL
https://track.adform.net/wpf/v2/kda44j1c.lY5BNvcKyAdMUDFBpBeA0fUm7qKFz0Xnj3wMvsD7z5meTuCUMz_WMXdMYGzXJJIneGffLMC7EZ3QHPBirTYKUowRslzRQqwSM2VHqwodv.numypZHgfLMC7AeLd7FmrpwoNN5uQ4s5uQ1szHVyVxFAk.rpwoNJ9z4oYYLzZGgeWy24bT8sjrkRGyC_JxoPyjzA1j4Hj5Yz3ccbbJYMLgiPFU77qZoOSix5ezdstlYysrhsui6._htdIq0bp_xf7_OLgiPFMtrs1OeyjaY1vSiws9q25SZytnf5jaY2ftckuyPBDjaY1HGOg3ZLQ0I5Kp0pueCq.ev.2dI_AIQjvEodUW2vqCRc7L1eLY6R4q53b4ub97Shr_JzK9zWCwHCSFQ_01kKJA237lY5BSmxGY5BNBtQT.clYIT3SvgMJgJ0Nc1lF4XVA4.L9.gJ.elF1VLf4.9dPgJ2MnGmRgJ2MnGmRgJ.c7KXV4.hL9.LxU..0PN/adfserve/?CC=1&bn=28999662;rtbwp=2.0;rtbdata=vzB8uL8iSYCYOuySptf0MlMML11tIWZxlvVdYMMTe3EIH3ODpUbFIAe9vlaKmsguXqInUZd6Omj8eX8d_GOG6_RPhuwD0ITOVSmet1wuRhS1jyt10yFCA4pEsjGOlwJc65oIO3sJpiLPh184sS_bJ6RHO9qy59mNwb8y4cbJGqqrwYdhe-1wFGFwyqMUtzwtGBN47w9GBI57YVxq5O07ubpYSXCx1r_WjU161wOQ4OGQE5rFF4E7UMpj28Ie8fU18m0Q2bxtWIL1Z9eJkIHLr7B_k6PTZltdLq7ICLInLsC9KJwDPdWax1eUuojBguzFZ2P-Lt-mbKvjC-TW_aZ09JPsdx2lr8S-gah0A5feet8_zoEf-rDa9K3Nimj0-8As0WAW1LOz1C63GTp4t9ZR7Ca3osDQ9G2dw3iI60gHGBc1;js=1;adfxid=1x;9059;set=en-US|en-US|1600X1200|0|150|600|24|8|3|7|0;fd=0|15&CREFURL=https%3A%2F%2Fwww.tvtoday.de%2F
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/bootstrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
a021a34e1ef503987176af22c07a35fc494035bb4469a664861487fe54968d36

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
2504
expires
-1
hic_qos
ssl.1.damoh.tvtoday.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.tvtoday.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
78.46.71.136 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate, br
Host
ssl.1.damoh.tvtoday.de
User-Agent
Mozilla/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.tvtoday.de/
Cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/; __gads=ID=5252ca2d077782dd:T=1552868825:S=ALNI_MZ3zkLugEqf1tGKdUJRMHwlBZU2sQ
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
Last-Modified
Mon, 03 Sep 2018 14:21:31 GMT
Server
openresty/1.13.6.2
ETag
"5b8d436b-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame C7C4
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
8d40ddd8b0eb636bac9b795654e04c5c1cb6b3a23930f19c4a3f3e30948d3f8d

Request headers

Response headers

Content-Type
text/javascript
truncated
/ Frame 9E3B
214 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e0a3a169637315f45b887d677bd7d2cc1d00d404ccf681b529acbe31cbe87aea

Request headers

Response headers

Content-Type
image/png
/
track.adform.net/jsmetrics/ Frame D567
43 B
162 B
Image
General
Full URL
https://track.adform.net/jsmetrics/?adfserve=76&asset=121&sid=276&rid=10478&cid=1712
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
last-modified
Wed, 11 Oct 2017 14:26:30 GMT
server
nginx
etag
"59de2a16-2b"
content-type
image/gif
status
200
accept-ranges
bytes
content-length
43
m
ad.yieldlab.net/ Frame D567
Redirect Chain
  • https://dsp.adfarm1.adition.com/cookie/?ssp=1
  • https://ad.yieldlab.net/m?dt_id=15233&ext_id=6669520818358319243
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=15233&ext_id=6669520818358319243
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 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, 17 Mar 2019 00:27:06 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=15233&ext_id=6669520818358319243
Date
Mon, 18 Mar 2019 00:27:06 GMT
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Server
nginx
Connection
keep-alive
Transfer-Encoding
chunked
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
usermatch.gif
beacon.krxd.net/ Frame D567
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=6669520818358319243
0
453 B
Image
General
Full URL
https://beacon.krxd.net/usermatch.gif?partner=activeagent&partner_uid=6669520818358319243
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.228.202.240 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
Cache-Control
private, no-cache, no-store
X-Request-Time
D=99 t=1552868826
Connection
keep-alive
X-Served-By
beacon-n027-dub.krxd.net
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"

Redirect headers

Location
https://beacon.krxd.net/usermatch.gif?partner=activeagent&partner_uid=6669520818358319243
Date
Mon, 18 Mar 2019 00:27:06 GMT
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Server
nginx
Connection
keep-alive
Transfer-Encoding
chunked
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
2.gif
dmp.theadex.com/d/817/i/ Frame D567
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=6669520818358319243
43 B
498 B
Image
General
Full URL
https://dmp.theadex.com/d/817/i/2.gif?c=&axd_pid=14&axd_fuid=6669520818358319243
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.116 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 GMT
last-modified
Mon, 18 Mar 2019 00:27:06 GMT
server
nginx
p3p
CP="CAO PSA OUR"
status
200
cache-control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
content-transfer-encoding
binary
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=6669520818358319243
Date
Mon, 18 Mar 2019 00:27:06 GMT
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Server
nginx
Connection
keep-alive
Transfer-Encoding
chunked
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
2.gif
id5-sync.com/c/112/2/8/ Frame D567
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=6669520818358319243&sInitiator=yl
  • https://uip.semasio.net/adition/1/info2?sType=sync&sExtCookieId=6669520818358319243&sInitiator=yl
  • https://id5-sync.com/s/112/4235DA63E1225995/9.gif
  • https://id5-sync.com/c/112/112/9/1.gif?puid=4235DA63E1225995
  • https://secure.adnxs.com/getuid?https://id5-sync.com/c/112/2/8/2.gif?puid=$UID
  • https://secure.adnxs.com/bounce?%2Fgetuid%3Fhttps%3A%2F%2Fid5-sync.com%2Fc%2F112%2F2%2F8%2F2.gif%3Fpuid%3D%24UID
  • https://id5-sync.com/c/112/2/8/2.gif?puid=4885345172670062659
43 B
668 B
Image
General
Full URL
https://id5-sync.com/c/112/2/8/2.gif?puid=4885345172670062659
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.36.123.231 Woodbridge, United States, ASN16276 (OVH, FR),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:07 GMT
Server
Apache-Coyote/1.1
Content-Type
image/gif;charset=UTF-8
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"

Redirect headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:09 GMT
AN-X-Request-Uuid
a3d7bd11-5823-44c6-8a69-9ba46146fc2b
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
Location
https://id5-sync.com/c/112/2/8/2.gif?puid=4885345172670062659
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
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
83.143.245.187; 83.143.245.187; 247.bm-nginx-loadbalancer.mgmt.fra1; *.adnxs.com; 37.252.172.203:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
m
ad.yieldlab.net/ Frame D567
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=CAESELO7NN_Iso_wpHkhs5OJXLQ&google_cver=1
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=52&ext_id=CAESELO7NN_Iso_wpHkhs5OJXLQ&google_cver=1
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 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, 17 Mar 2019 00:27:06 GMT

Redirect headers

pragma
no-cache
date
Mon, 18 Mar 2019 00:27:06 GMT
server
HTTP server (unknown)
location
https://ad.yieldlab.net/m?dt_id=52&ext_id=CAESELO7NN_Iso_wpHkhs5OJXLQ&google_cver=1
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
288
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
m
ad.yieldlab.net/ Frame D567
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=4103e265-207b-4341-9e64-f29ce43bd64d
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=99739&ext_id=4103e265-207b-4341-9e64-f29ce43bd64d
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 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, 17 Mar 2019 00:27:07 GMT

Redirect headers

pragma
no-cache
date
Mon, 18 Mar 2019 00:27:06 GMT
x-aspnet-version
4.0.30319
location
https://ad.yieldlab.net/m?dt_id=99739&ext_id=4103e265-207b-4341-9e64-f29ce43bd64d
p3p
CP="NOI DSP COR CUR ADMo DEVo PSAo PSDo OUR SAMo BUS UNI NAV"
status
302
cache-control
private,no-cache, must-revalidate
content-type
text/html
content-length
193
m
ad.yieldlab.net/ Frame D567
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=4258007426103092333
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=140420&ext_id=4258007426103092333
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 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, 17 Mar 2019 00:27:06 GMT

Redirect headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:08 GMT
AN-X-Request-Uuid
96014559-45da-4c13-9fb3-a5979772ab83
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
Location
https://ad.yieldlab.net/m?dt_id=140420&ext_id=4258007426103092333
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
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
83.143.245.187; 83.143.245.187; 313.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.87:80
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
m
ad.yieldlab.net/ Frame D567
Redirect Chain
  • https://c1.adform.net/serving/cookie/match?party=6
  • https://ad.yieldlab.net/m?dt_id=4879&ext_id=-8024436743952979522
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=4879&ext_id=-8024436743952979522
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 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, 17 Mar 2019 00:27:06 GMT

Redirect headers

pragma
no-cache
date
Mon, 18 Mar 2019 00:27:06 GMT
server
nginx
access-control-allow-origin
*
location
https://ad.yieldlab.net/m?dt_id=4879&ext_id=-8024436743952979522
status
302
cache-control
no-cache, no-store, must-revalidate, no-transform
content-length
0
expires
-1
m
ad.yieldlab.net/ Frame D567
Redirect Chain
  • https://a.twiago.com/rtb/usermatch.php?umid=1&call_type=redirect&rtbprovider=empty&redirecturl=https%3A%2F%2Fad.yieldlab.net%2Fm%3Fdt_id%3D35250%26ext_id%3D%25userid%25
  • https://ad.yieldlab.net/m?dt_id=35250&ext_id=87f18197347d01491ea6bf44e30ce225bbe2bcb4110c63027dab0603cfb18
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=35250&ext_id=87f18197347d01491ea6bf44e30ce225bbe2bcb4110c63027dab0603cfb18
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 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, 17 Mar 2019 00:27:07 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=35250&ext_id=87f18197347d01491ea6bf44e30ce225bbe2bcb4110c63027dab0603cfb18
Date
Mon, 18 Mar 2019 00:27:06 GMT
Server
Apache
Content-Type
text/html; charset=ISO-8859-1
Content-Length
0
P3P
policyref="https://help.adspirit.de/w3c/adspirit.p3p", CP="NOI DSP COR NID PSAo PSDo IVAo IVDo OUR STP UNI COM NAV DEM"
m
ad.yieldlab.net/ Frame D567
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=yieldlab
  • https://x.bidswitch.net/ul_cb/sync?ssp=yieldlab
  • https://a.volvelle.tech/sync?ssp=bidswitch&bidswitch_ssp_id=yieldlab
  • https://a.volvelle.tech/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=yieldlab
  • https://x.bidswitch.net/sync?dsp_id=190&expires=14&user_group=0&user_id=&ssp=yieldlab
  • https://x.bidswitch.net/ul_cb/sync?dsp_id=190&expires=14&user_group=0&user_id=&ssp=yieldlab
  • https://ad.yieldlab.net/m?dt_id=6850&ext_id=fbe8969a-bf41-49c6-8162-41ef6241be27
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=6850&ext_id=fbe8969a-bf41-49c6-8162-41ef6241be27
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 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, 17 Mar 2019 00:27:07 GMT

Redirect headers

Date
Mon, 18 Mar 2019 00:27:07 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=fbe8969a-bf41-49c6-8162-41ef6241be27
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Keep-Alive
timeout=10
Content-Length
0
m
ad.yieldlab.net/ Frame D567
Redirect Chain
  • https://p.rfihub.com/cm?pub=19593&in=1
  • https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1871597490093458918
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1871597490093458918
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 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, 17 Mar 2019 00:27:07 GMT

Redirect headers

Location
https://ad.yieldlab.net/m?dt_id=6035831&ext_id=1871597490093458918
Server
Jetty(9.0.6.v20130930)
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:00 GMT
m
ad.yieldlab.net/ Frame D567
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=bd405c8e-e293-4b00-bbcd-2f7b74ac98f6
0
495 B
Image
General
Full URL
https://ad.yieldlab.net/m?dt_id=6061522&ext_id=bd405c8e-e293-4b00-bbcd-2f7b74ac98f6
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 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, 17 Mar 2019 00:27:07 GMT

Redirect headers

Date
Mon, 18 Mar 2019 00:27:06 GMT
Server
MT3 1.31.3.9 fe26b9c DPLAT-404 zrh-pixel-x10
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=bd405c8e-e293-4b00-bbcd-2f7b74ac98f6
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Keep-Alive
timeout=360
Content-Length
0
Expires
Mon, 18 Mar 2019 00:27:05 GMT
300x250
ad.yieldlab.net/d/27713/21691/ Frame 10D8
927 B
2 KB
Script
General
Full URL
https://ad.yieldlab.net/d/27713/21691/300x250?ts=1552868825754&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/adengine/tvtoday/adengine.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
3352122affbcb9159a20c61141787d520d073690392c2729487a06f96ac4d5a5

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Language
de-DE
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
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
701
Expires
Sun, 17 Mar 2019 00:27:06 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 10D8
77 KB
0
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_319.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Mon, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1552585448432221"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=3000
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
29080
x-xss-protection
1; mode=block
expires
Mon, 18 Mar 2019 00:27:05 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 10D8
0
63 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvP6i6Me36O12BUOBw5XimXZQ-oMaXX4hgENx6bNfdxi5FcuctKeB63alhiLoQ9QdNdjPnUb7vnQP3plZBzNQVfYdvCIZliDz_M_-pbWVwQveWN5Fgmx3WZ7PKBh-nhqyNscQ3nhNhV17inWD4of27W9QS0ffc4RbliB0CVfU_PEAYO3_sBtgp705m6AiWLlilAmRn3l8foDtHms0eSU-XC-tXe0OU6jguJzCwdIEigtIqrTaUgrw2C0H_rLKRXhOFcFCM2cRAFrg&sai=AMfl-YQcAt1NhWCeYdsAGOgirWYqS6R2i_mJtkGQbmyEkcOl3oK88bOwwZSFk2A557aRlF9ZpNsXEVofRzk5CeC3Rgxz5FPSEEFNh3zDGwkOt9h3jW_RygdPtKOq1pu5&sig=Cg0ArKJSzJu_NGSd6gnuEAE&urlfix=1&adurl=
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
74.125.206.156 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
wk-in-f156.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.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,44,43,39"
content-length
0
x-xss-protection
1; mode=block
Standard
s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/ Frame D567
85 KB
35 KB
Script
General
Full URL
https://s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/Standard
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/bootstrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.5.73 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
401a531c518c60170d8f34f3328c5709518b8a2f298fb0b337a4b7dacc8034df

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
content-encoding
gzip
last-modified
Tue, 05 Mar 2019 09:52:41 GMT
server
nginx
access-control-allow-origin
*
x-cache-status
HIT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=100000
expires
Tue, 19 Mar 2019 03:57:39 GMT
truncated
/ Frame D567
213 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
6e8f2eb028fba047efa8d84eeea5d1faffe522882d0ad7c1bbd5c26edda5cbfa

Request headers

Response headers

Content-Type
image/png
/
track.adform.net/adfscript/ Frame 10D8
1 KB
1 KB
Script
General
Full URL
https://track.adform.net/adfscript/?bn=28999661;rtbwp=2.0;rtbdata=sAP9FHZerDmzsaRTurOjHgtTdqlUltzF5BtwIfiJDjbvNbwdVjYAYfaCOpVma6t3XqInUZd6Omj8eX8d_GOG6_RPhuwD0ITOVSmet1wuRhS1jyt10yFCA4pEsjGOlwJc65oIO3sJpiLPh184sS_bJ6RHO9qy59mNwb8y4cbJGqrvUZfHrXHgE2FwyqMUtzwtUg69Hz5caOR7YVxq5O07ubpYSXCx1r_WjU161wOQ4OGQE5rFF4E7UMpj28Ie8fU18m0Q2bxtWIL1Z9eJkIHLr7B_k6PTZltdLq7ICLInLsC9KJwDPdWax1eUuojBguzFZ2P-Lt-mbKvjC-TW_aZ09JPsdx2lr8S-gah0A5feet8_zoEf-rDa9K3Nimj0-8As0WAW1LOz1C63GTp4t9ZR7Ca3osDQ9G2dw3iI60gHGBc1
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27713/21691/300x250?ts=1552868825754&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
6123e96ff7cf04d289732d7e18ac89faf3cf3a87ae05e2701d3e4350b3e063ce

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
944
expires
-1
ve
counts.yieldlab.net/ Frame 10D8
0
360 B
Image
General
Full URL
https://counts.yieldlab.net/ve?d=ODE9ZSYzMzI2Mjg4NjgyNTUxPXN0JmU2M2QyMzdkZDhjOS02OGY4LTNmNTQtZTA3Zi0xZjQzODg5Mz1kaXQmMj12
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27713/21691/300x250?ts=1552868825754&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 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, 17 Mar 2019 00:27:06 GMT
imp
counts.yieldlab.net/ Frame 10D8
0
360 B
Image
General
Full URL
https://counts.yieldlab.net/imp?s=21691&d=5210280&a=27713&ts=1552868826233&tid=398834f1-f70e-45f3-8f86-9c8dd732d36e&l=0
Requested by
Host: ad.yieldlab.net
URL: https://ad.yieldlab.net/d/27713/21691/300x250?ts=1552868825754&consent=BOdlPp2OdlPp2AjABBBFBP-AAAAdJbNIbYoawoSAuHKlVgAhAAqlgCgAyAQAEQACQAYAAEACSAEigBUACAAAAIQACAFACAAAAEAQEAAAAAA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.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.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 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, 17 Mar 2019 00:27:06 GMT
/
ssl.3.damoh.tvtoday.de/1f8c124a8a98aaedb7c4605693ad29c540dce86c/
112 B
676 B
XHR
General
Full URL
https://ssl.3.damoh.tvtoday.de/1f8c124a8a98aaedb7c4605693ad29c540dce86c/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIE9obGVpRHVyb29Ob3R1cGg9T2hsZWlEdXJvb05vdHVwaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBkYSgpe3kuR2V8fCh5LkdlPTApO3kuR2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5HZSYmd2luZG93LnNldFRpbWVvdXQoZGEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7ZWE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGZhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZ2EoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5RYShhLGIsW10sYyxjLGwpfSl9bC5mKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIGhhKGdhLDUwKX1mdW5jdGlvbiBpYShjLGIpe2J8fChiPSJwcmUiKTtpZihtJiZsKXtjLnBhdXNlKCk7dmFyIGE9bmV3IE8oYyksYT1uZXcgUChhLGwpLGc9bS5hZFRhZzsicHJlIj09YiYmbS5wcmVyb2xsQWRUYWcmJihnPW0ucHJlcm9sbEFkVGFnKTsicG9zdCI9PWImJm0ucG9zdHJvbGxBZFRhZyYmKGc9bS5wb3N0cm9sbEFkVGFnKTsKZyYmKGEubmgobSksYS54ZShnKSl9ZWxzZSBoYShmdW5jdGlvbigpe2lhKGMpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBxKGMsYil7aWYoZS5EbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5VYyxjLnYoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmUudHJhY2soImFjdGl2YXRlZEF0IixhKX1iP2wucWE9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7YT1uZXcgamE7YS50ZChjKTthLnR1KGwpO2Euc3UobSk7YS5kdSgpO2EuYygpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtxKGMsYil9LmJpbmQodGhpcyksNTApfWM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVxPXRoaXMuYVsxXTt0aGlzLmpxPQp0aGlzLmFbMTBdO3RoaXMuemk9dGhpcy5hWzhdO3RoaXMuanQ9dGhpcy5hWzZdO3RoaXMuT2o9dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbNV19Yy5qdT1iO2IucHJvdG90eXBlPXtjcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZXE6dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmpxOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56aTp0aGlzLml0KGEpfSxpdDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuanQ6dGhpcy5OaihhKX0sTmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIGthPWMuanV8fGthLFljPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVljLmNxKDQpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5Ebz0hMTt0aGlzLk1hPSJzZXR1cCI7dGhpcy54Yz1bXTt0aGlzLlJmKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuS3QuYmluZCh0aGlzKSl9Yy5Jaj1iO2IucHJvdG90eXBlPXtSZjpmdW5jdGlvbigpe3RoaXMuY2E9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx4bjpmdW5jdGlvbihhKXt0aGlzLmNhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEmJmEucG9zdE1lc3NhZ2UmJmEucG9zdE1lc3NhZ2UoYiwiKiIpfSwKbmE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEt0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLkp0KGEuZGF0YSl9LEp0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuY2EmJnRoaXMuY2EuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5jYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmNhJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXImJmEuZXZlbnQ9PXRoaXMuY2EuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmNhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LFJkOmZ1bmN0aW9uKGEsYil7dGhpcy5jYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LFZmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS3EoYSksZD0hMTtpZihiKXJldHVybiBhPWEucmVwbGFjZShiLCIiKSsiL2Rldi9ob21hZF91cmwvIitiKyIvIiwKYT1hLnJlcGxhY2UoL1wvXC9kZXZcL2hvbWFkX3VybC9nLCIvZGV2L2hvbWFkX3VybCIpLGE9YS5yZXBsYWNlKC9cL1wvZGV2XC9ob21hZF91cmwvZywiL2Rldi9ob21hZF91cmwiKSxhPWEucmVwbGFjZSgvXC9cL2RldlwvaG9tYWRfdXJsL2csIi9kZXYvaG9tYWRfdXJsIiksdGhpcy5NZyhhLCJQT1NUIix7fSxmdW5jdGlvbihhKXt0cnl7ZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYil7Y29uc29sZS5sb2coInd0ZiIsYil9fSxmdW5jdGlvbigpe30sITAsITApLGR9LEtxOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChiPWIuZXhlYyhhKSkmJihiWzJdfHxiWzVdKSl7aWYoYlsyXSlyZXR1cm4gYlsyXTtpZihiWzVdKXJldHVybiBiWzVdfWVsc2UgaWYoYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKSwoYj1iLmV4ZWMoYSkpJiZiWzRdKXJldHVybiBiWzRdO3JldHVybiExfSx2bjpmdW5jdGlvbihhLGIpe2lmKGIpe2lmKGE9PWIpe2lmKGUud3EoYSkpcmV0dXJuOyhiPXRoaXMuVmYoYSkpfHwoYj1hKX0wPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmNhLnVybHNbYV09Yjt0aGlzLmNhLnVybHNbYl09YTt0aGlzLmNhLmhvbWFkVXJsc1thXT1iO3RoaXMuY2Eub3JpZ2luYWxVcmxzW2JdPWF9fSx3cTpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLmhvbWFkVXJsc1thXSYmKGI9dGhpcy5jYS5ob21hZFVybHNbYV0pO3JldHVybiBifSxlZzpmdW5jdGlvbihhKXt2YXIgYj0hMTt0aGlzLmNhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5jYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxUYTpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF8iK2EsYiwhMCl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PQphfHwiYWJvdXQ6c2VsZiI9PWF8fCIiPT1hfSxMYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT10eXBlb2YgYSlyZXR1cm4gMDt2YXIgYj0wLGQ9IiI7Zm9yKGQgaW4gYSlhLmhhc093blByb3BlcnR5KGQpJiZiKys7cmV0dXJuIGJ9LG1nOmZ1bmN0aW9uKGEsYil7dmFyIGQ9YVtiXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSx0aDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxFZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/CjA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmYS5yaWdodDw9KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpOiExOiExfSxwZTpmdW5jdGlvbihhLGIpe3ZhciBkPTAsZj0wLGM9MCxoPTAsZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciByPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIXIpcmV0dXJuITE7Yz1yLmhlaWdodCpyLndpZHRoO2Q9ci53aWR0aDtmPXIuaGVpZ2h0OzA+ci50b3AmJihmKz1yLnRvcCk7ci5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1yLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+ci5sZWZ0JiYoZCs9ci5sZWZ0KTtyLnJpZ2h0Pih3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSYmKGQtPXIucmlnaHQtKHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxjJiYoaD0xMDAvYypkKmYpO2g+PWImJihlPSEwKTtyZXR1cm4gZX0scWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xZShhKX0uYmluZCh0aGlzKSwxMDApfSwKc2I6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhP01hdGguYWJzKGEpOjEwO3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGEpKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sZWE6ZnVuY3Rpb24oYSl7YT1hJiYibnVtYmVyIj09PXR5cGVvZiBhJiYwPGE/TWF0aC5yb3VuZChhKToxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGtlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxxaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZjtmb3IoZD03OzA8PWQ7ZC0tKWY9YT4+PjQqZCYxNSxnKz1mLnRvU3RyaW5nKDE2KTsKcmV0dXJuIGd9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGMsaD1BcnJheSg4MCksZT0xNzMyNTg0MTkzLHI9NDAyMzIzMzQxNyxKPTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx2LHEsdDthPWEmJiJzdHJpbmciPT09dHlwZW9mIGE/YToiIjtuPWEubGVuZ3RoO3ZhciBwPVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnwKYS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihwLnB1c2goZik7MTQhPXAubGVuZ3RoJTE2OylwLnB1c2goMCk7cC5wdXNoKG4+Pj4yOSk7cC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHAubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWhbZl09cFthK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyloW2ZdPWQoaFtmLTNdXmhbZi04XV5oW2YtMTRdXmhbZi0xNl0sMSk7Yz1lO249cjtsPUo7dj1rO3E9bTtmb3IoZj0wOzE5Pj1mO2YrKyl0PWQoYyw1KSsobiZsfH5uJnYpK3EraFtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT12LHY9bCxsPWQobiwzMCksbj1jLGM9dDtmb3IoZj0yMDszOT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7Zm9yKGY9NDA7NTk+PWY7ZisrKXQ9ZChjLDUpKyhuJmx8biZ2fGwmdikrcStoW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXYsdj1sLApsPWQobiwzMCksbj1jLGM9dDtmb3IoZj02MDs3OT49ZjtmKyspdD1kKGMsNSkrKG5ebF52KStxK2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHE9dix2PWwsbD1kKG4sMzApLG49YyxjPXQ7ZT1lK2MmNDI5NDk2NzI5NTtyPXIrbiY0Mjk0OTY3Mjk1O0o9SitsJjQyOTQ5NjcyOTU7az1rK3YmNDI5NDk2NzI5NTttPW0rcSY0Mjk0OTY3Mjk1fXJldHVybihiKGUpK2IocikrYihKKStiKGspK2IobSkpLnRvTG93ZXJDYXNlKCl9LGtiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxoLGUscixrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxjPj42LHI9YyY2Myxpc05hTihmKT9lPXI9NjQ6aXNOYU4oYykmJihyPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KHIpO3JldHVybiBifSxPcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LCRkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEsYz0hMSxoPSExLGU9ITEscj0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7Zj0Kd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoIndlYmRyaXZlciIpfHxuYXZpZ2F0b3Iuem8/ITA6ITF9Y2F0Y2godCl7fXRyeXtjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksaD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxyPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IXImJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZjthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZTthLmlzSUU9cjthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9Cm07cmV0dXJuIGF9LEVxOmZ1bmN0aW9uKCl7dmFyIGE9IlUiLGI9dGhpcy4kZCgpO2IuaXNQaGFudG9tSlM/YT0iSFAiOmIuaXNDaHJvbWVIZWFkbGVzcz9hPSJIQyI6Yi5pc0ZpcmVmb3hIZWFkbGVzcz9hPSJIRiI6KGIuaXNCbGluayYmKGE9IkIiKSxiLmlzT3BlcmEmJihhPSJPIiksYi5pc0ZpcmVmb3gmJihhPSJGIiksYi5pc1NhZmFyaSYmKGE9IlMiKSxiLmlzSUUmJihhPSJJIiksYi5pc0VkZ2UmJihhPSJFIiksYi5pc0Nocm9tZSYmKGE9IkMiKSk7cmV0dXJuIGF9LFBhOmZ1bmN0aW9uKCl7dmFyIGE9e2ZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LHZpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHBsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LApMbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0scW86ZnVuY3Rpb24oKXtyZXR1cm4gYS5maSgpfHxhLnZpKCl8fGEub3IoKXx8YS5wbCgpfHxhLkxtKCl9fTtyZXR1cm4gYS5xbygpfSxHYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBkPXt9LGY9MTQ7Zi0tOylkW2JbZl1dPQphW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLGM9YS5sZW5ndGg7ZjxjOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LGllOmZ1bmN0aW9uKGEpe2E9dGhpcy5HYShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHFiOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtiJiYtMTxiLmluZGV4T2YoYSkmJihkPQohMCk7cmV0dXJuIGR9LHFwOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkPVtdLGY9W10sYz0wO2M8Yi5sZW5ndGg7YysrKWRbYltjXV09ITA7Zm9yKGM9MDtjPGEubGVuZ3RoO2MrKylkW2FbY11dfHxmLnB1c2goYVtjXSk7cmV0dXJuIGZ9LE91OmZ1bmN0aW9uKGEsYil7dmFyIGQ9LTEsZj0iIjt0cnl7MDxhLmluZGV4T2YoIiUiKSYmMDxiPyhmPWEuc3BsaXQoIiUiKSxkPWIvMTAwKmYpOihkPWEuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2goYyl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0saWc6ZnVuY3Rpb24oYSl7YT1NYXRoLnJvdW5kKGEpO3ZhciBiPSItLTotLSI7MDw9YSYmKGE9TWF0aC5mbG9vcihhKSxiPU1hdGguZmxvb3IoYS82MCksYj10aGlzLkZoKGIpKyI6Iit0aGlzLkZoKE1hdGguZmxvb3IoYS02MCpiKSkpO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtyZXR1cm4gMTA+YT8iMCIrYS50b1N0cmluZygpOgphLnRvU3RyaW5nKCl9LFNlOmZ1bmN0aW9uKGEpe3RoaXMuTWE9YX0sZmlyZUV2ZW50OmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtmPXt9O3ZhciBjPSExO2Quc3RhdGU9dGhpcy5NYTt0cnl7bGEmJihmLnNlc3Npb25pZD1sYSxjPSEwKTtpZihkLmFkU2Vzc2lvbil7Zi5hZGlkPWQuYWRTZXNzaW9uO2M9ITA7dHJ5e2RlbGV0ZSBkLmFkU2Vzc2lvbn1jYXRjaChoKXtkLmFkU2Vzc2lvbj12b2lkIDB9fWMmJmQuY29kZSYmKDEwMDU9PWQuY29kZXx8MTAwNj09ZC5jb2RlfHwxMDA3PT1kLmNvZGV8fDEwMDg9PWQuY29kZXx8MTAwOT09ZC5jb2RlKSYmKGYuZXZlbnRfaW50PWQuY29kZSx0aGlzLkdmKGYpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LApqYzpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sdzpmdW5jdGlvbihhLGIsZCxmLGMsaCxaYyl7dmFyIHI9YTtkJiZiJiYoYj1rLkZiKGIsZCkpO2ImJihyPWsuRmIoYSxiKSk7ZiYmKHI9ay5GYihyLGYpKTtjJiYocj1rLkZiKHIsYykpO2gmJihyPWsuRmIocixoKSk7WmMmJihyPWsuRmIocixoKSk7ZS5qYyhyKX0sR2Y6ZnVuY3Rpb24oYSl7aWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZihhKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobC5pc0VuYWJsZWQpe2lmKCJvYmplY3QiPT10eXBlb2YgYSl0cnl7YT1KU09OLnN0cmluZ2lmeShhKX1jYXRjaChiKXthPWEudG9TdHJpbmc/YS50b1N0cmluZygpOiIifWEmJmEudHJpbSYmKGE9YS50cmltKCkpO3ZhciBkPWwucmQoKSsiP2hvbWFkX2F0PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wudmEoZCwhMCk7ZD1sLnZhKGQsCiEwKTtkLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtkLmRhdGEuaG9tYWRfYXQ9ZW5jb2RlVVJJQ29tcG9uZW50KGEpO2wuRWEoZCxmdW5jdGlvbigpe30pfX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIWx8fCFsLmJhKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy55Y3x8KHRoaXMueWM9e30pO3RoaXMueWNbZl18fCh0aGlzLnljW2ZdPTApO3RoaXMueWNbZl0rKzsxMDx0aGlzLnljW2ZdfHwoZj1sLnJkKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKSxsLnZhKGYsITApLGY9bC52YShmLCEwKSxmLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KIiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5FYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSx5ZTpmdW5jdGlvbigpe2wmJmwuYmE/bC5pc0VuYWJsZWQmJmwuVG8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWUoKX0uYmluZCh0aGlzKSw1MDApfSxnZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJgphLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLllhKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxqZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sWWE6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5kZChhKToiIn0sZGQ6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5qZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9LEtvOmZ1bmN0aW9uKGEsYixkKXtkPSExO2lmKGIuc2UoYSl8fHRoaXMuUXIoYSl8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3gubGhbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fApzYW5kYm94LmxoWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLmVnKGEpKXJldHVybiB0aGlzLmVnKGEpO3ZhciBmPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2YuaG9tYWRfdXJsX3N1ZmZpeD1hO2YuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy5rYihhKTtmLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Zi5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2QmJihmLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2YuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Zi5ob21hZF92cGFpZF9jdHg9InRydWUiO3ZhciBjPSExO2Q9ITE7ZD10aGlzLlFhKGEsYi5DYSxmLGZ1bmN0aW9uKGEpe2M9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7Y3x8KGM9ZCksYz1KU09OLnBhcnNlKGMpfWNhdGNoKGgpe2M9ITF9Yy51cmwmJmMuaGFzaCYmKGM9Yi5nZCgpLnJlcGxhY2UoIltoYXNoXSIsCmMuaGFzaCkpO3RoaXMudm4oYyxhKTtyZXR1cm4gY30sUWE6ZnVuY3Rpb24oYSxiLGQsZixjLGgsZSxyKXt2YXIgaz1ofHxsO2g9ITA7ciYmKGg9ITEpO2lmKGsmJmsuYmEpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChtKXtjKG0pfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLnZhKGEsaCk7aD1rLnZhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9YjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5FYShoLGYsYywiIiwiIixlKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWEoYSxiLGQsZixjLGssZSxyKX0uYmluZCh0aGlzKSw1MDApfSxNZzpmdW5jdGlvbihhLGIsZCxmLGMsaCxlKXt2YXIgcj0hMDtlJiYocj0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtlPWQ7ZD0iIjsKZm9yKHZhciBrIGluIGUpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChlW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsYSxyKSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sZnM6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuTWcoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMueGMpZm9yKHZhciBjIGluIHRoaXMueGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy54Y1tjXSk7CmM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLmtiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpO2ImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTmc6ZnVuY3Rpb24oYSxiLGQsZil7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLmtiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5RYShhLGYuQ2EsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPQpKU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5mcyhmLmdkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54Yz1hfSxBdzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuUWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYoZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksCmI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0scm86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LE1yOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKylpZihiW2ZdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUT1jLklqfHwKUTtuZXcgUTt2YXIgZT1uZXcgUTt3aW5kb3cuWHc9ZTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Iaj1iO2IuRmI9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnd0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLkJzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmh3PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuZnE9e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi52dz17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkVmPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IiwKbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi54Zj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuQmY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuRmY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmxuPXtjb2RlOiIxMDA5Iix0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLnpmPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuS3Y9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkFzPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLApuYW1lOiJhZEVycm9yIn07Yi5ncT17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuU2Y9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5ncD17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuVmM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi5VYz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuRGY9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5wbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLk9kPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLlFkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07Yi5ubj17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2IuTWg9e2NvZGU6IjEwMjUiLHR5cGU6InZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6InZpZXdhYmxlIn07Yi5Ecz17Y29kZToiMTAyNiIsdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTtiLmxkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTsKYi5kZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuVGY9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmd3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkh2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQ3M9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgaz1jLkhqfHxrO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbj10aGlzLmFbOF07dGhpcy51dj10aGlzLmFbMTBdO3RoaXMucXY9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbNV19Yy5Saz1iO2IucHJvdG90eXBlPXtSbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlNuOnRoaXMudHYoYSl9LHR2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy51djp0aGlzLnB2KGEpfSxwdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXY6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgbWE9Yy5Sa3x8bWEsJGM9bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9JGMuUm4oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9CmMuSmo9YjtiLnByb3RvdHlwZT17a2U6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGYsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKylmPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2YsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGxiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci5GfHwieCIpfSxOcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsKKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sYWQ6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLmFkKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuYWQoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxxYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmtlKHRoaXMubGIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5hZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sRnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xYygpKwoiMiJ9LEJnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMua2UodGhpcy5OcSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLmFkKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgUj1jLkpqfHxSO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnprPXRoaXMuYVs0XTt0aGlzLkZ2PXRoaXMuYVsyXTt0aGlzLk50PXRoaXMuYVs5XTt0aGlzLlFpPXRoaXMuYVsxXTt0aGlzLldzPXRoaXMuYVs2XTt0aGlzLnN0PXRoaXMuYVsxXTt0aGlzLkVyPXRoaXMuYVs4XTt0aGlzLkZwPXRoaXMuYVsxXTt0aGlzLmtwPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs0XTt0aGlzLmw9dGhpcy5hWzFdfWMuVXQ9YjtiLnByb3RvdHlwZT17eWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy56azp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnY6dGhpcy5NdChhKX0sTXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk50OnRoaXMuUGkoYSl9LFBpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUWk6dGhpcy5WcyhhKX0sVnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLldzOnRoaXMucnQoYSl9LHJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zdDp0aGlzLkRyKGEpfSxEcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRXI6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuanAoYSl9LGpwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rcDp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHA6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBuYT1jLlV0fHxuYSxhZD1uZXcgbmEoMSwKbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9YWQueWsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZj1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZylmW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBnPXRoaXMuaTt0aGlzLmk9ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmk9ZztyZXR1cm4gZn19KGMsZ1tjXSk6Z1tjXTtnPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5mP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT8KZi5mOmZ1bmN0aW9uKCl7ZC5mLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWY7Zi5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLm1mPWJ9KShjKTt2YXIgSz1jLm1mfHxLO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnlwPXRoaXMuYVsxMF07dGhpcy5UdD10aGlzLmFbOV07dGhpcy5Ocz10aGlzLmFbOF07dGhpcy5JdT10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbMV07dGhpcy5ZaT10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVsxXX1jLndqPWI7Yi5wcm90b3R5cGU9e3hwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy55cDp0aGlzLlN0KGEpfSxTdDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuVHQ6dGhpcy5NcyhhKX0sTXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Oczp0aGlzLkh1KGEpfSwKSHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkl1OnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Jazp0aGlzLlhpKGEpfSxYaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWWk6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBvYT1jLndqfHxvYSxiZD1uZXcgb2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1iZC54cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLkZsPUsuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuSGE9e307dGhpcy5HPW51bGw7dGhpcy51Yz0xMDA7dGhpcy50Yj0wO3RoaXMuRmE9MTUwO3RoaXMud2I9MDt0aGlzLnV1KGIpfSxjOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYT8odGhpcy50YisrLHRoaXMud2I9CndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKTowPnRoaXMuRmEmJih0aGlzLndiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLHRoaXMudWMpKX0sZnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50Yj50aGlzLkZhPyEwOiExfSxRZTpmdW5jdGlvbigpe3RoaXMudGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LHV1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LE06ZnVuY3Rpb24oYil7dGhpcy5IYVtiLmxiKCldPWI7TCYmTC5LZyYmTC5RdShiKX0sZHg6ZnVuY3Rpb24oKXtyZXR1cm4gZS5MYSh0aGlzLkhhKX0sSzpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGc7Zm9yKGcgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2ddLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9LE5yOmZ1bmN0aW9uKGIpe2I9Yi5CYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkhhKWlmKGIuaWQ9PQp0aGlzLkhhW2FdLkJhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LHN4OmZ1bmN0aW9uKGIpe3RoaXMuSGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciB0PWMuRmx8fHQ7KGZ1bmN0aW9uKGMpe2MuSGw9Sy5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy51Yz0xMDt0aGlzLnRiPTA7dGhpcy5GYT01MDt0aGlzLkw9bnVsbDt0aGlzLm9hPSExO3RoaXMucGxheWVyPWI7dGhpcy5vYj0iIjt0aGlzLlpmPSExO3RoaXMuTigpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxnPXRoaXMuQmEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWcpYi5jb250YWluZXJJZD1nLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt9LApEdTpmdW5jdGlvbihiKXt0aGlzLkw9Yn0sZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MfSx4dTpmdW5jdGlvbihiKXt0aGlzLkNlPWJ9LGN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQ2V9LEJlOmZ1bmN0aW9uKCl7fSxJOmZ1bmN0aW9uKCl7dGhpcy50Yjw9dGhpcy5GYSYmKHRoaXMudGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLnVjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxsZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxsYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxUZTpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHR4OmZ1bmN0aW9uKCl7fSxWOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLmpyKCl8fHRoaXMuc24oKTt0aGlzLlRlKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sZng6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sc246ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuZWEoMTApKX0sanI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFU6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEJhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiAwfSxiYjpmdW5jdGlvbigpe3JldHVybiExfSxteDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9hfSxtYTpmdW5jdGlvbigpe3RoaXMub2E9ITB9LE5iOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSx2ZTpmdW5jdGlvbigpe3JldHVybiExfSxvaDpmdW5jdGlvbihiKXt0aGlzLm9iPQpifSxieDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9ifSxpaDpmdW5jdGlvbigpe3RoaXMub2I9bnVsbH0saHg6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLm9iJiYoYj0hMCk7cmV0dXJuIGJ9LG94OmZ1bmN0aW9uKCl7dGhpcy5aZnx8KHRoaXMuWmY9ITApfSxsYzpmdW5jdGlvbigpe3JldHVybiExfSxadzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5IbHx8cDsoZnVuY3Rpb24oYyl7Yy5UaD1LLmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLnZmPSIxIjt0aGlzLndmPSIyIjt0aGlzLmFuPSIzIjt0aGlzLkNjPTA7dGhpcy5RZz0zMDt0aGlzLkJiPVtdO3RoaXMuVWE9W107dGhpcy5YYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuSGY9dGhpcy5JaD0hMTt0aGlzLnN0YXR1cz10aGlzLkNjO3RoaXMuaWQ9ZS5lYSgxMCk7dGhpcy50ZChiKTt0aGlzLnZ1KGEpfSxjOmZ1bmN0aW9uKCl7fSxqYTpmdW5jdGlvbigpe3RoaXMuSWh8fCh0aGlzLkloPSEwLGUueWUoKSl9LEZlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UyYmUy5JYiYmIXBhJiYocGE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sRDpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5rYSgpPyExOih0aGlzLkF1KCksdGhpcy5HKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy5CaCgpLHRoaXMuSGY9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LG86ZnVuY3Rpb24oYixhKXt0aGlzLmthKCl8fCh0aGlzLkJiLnB1c2goYiksdGhpcy5VYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sQmg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy5CYiYmMDx0aGlzLkJiLmxlbmd0aCYmKHRoaXMuQmI9ZS51bmlxdWUodGhpcy5CYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuQmIuam9pbigiLCIpKSk7aWYodGhpcy5VYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLlVhLmxlbmd0aDtnKyspdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl09PXRoaXMuWGJbYl0mJmEucHVzaCh0aGlzLlVhW2ddLmRldGFpbCksdGhpcy5YYlt0aGlzLlVhW2ddLnJlYXNvbl08dGhpcy5YYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuVWFbZ10uZGV0YWlsKSxiPXRoaXMuVWFbZ10ucmVhc29uKTt0aGlzLlhiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9ZS51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sZ3g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IZn0sczpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMudmZ9LEF1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMud2Z9LEJ1OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5hbn0sZWI6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLkNjfSx5ZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy52Zn0sTnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMud2Z9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLkNjfSx0ZDpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHZ1OmZ1bmN0aW9uKGIpe3RoaXMuRz1ifSxNcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LGpzOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHU9Yy5UaHx8dTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdD10aGlzLmFbOF07dGhpcy5XdD10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs2XX0KYy5uaT1iO2IucHJvdG90eXBlPXtrdDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubHQ6dGhpcy5WdChhKX0sVnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLld0OnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgcWE9Yy5uaXx8cWEsY2Q9bmV3IHFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9Y2Qua3QoNCk7KGZ1bmN0aW9uKGMpe2MuRWk9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLlUoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfSxpYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLApmdW5jdGlvbihiKXt0aGlzLmZiKGIpfS5iaW5kKHRoaXMpKX0sZmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuTCYmdGhpcy5MKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRGVtb1ZpZGVvSlMifX0pfSkoYyk7dmFyIFQ9Yy5FaXx8VDsoZnVuY3Rpb24oYyl7Yy5EaT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuR2Q9bnVsbDt0aGlzLlF2PTFFMzt0aGlzLlpnPW51bGw7dGhpcy5qdj0yRTN9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuem8pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLkQoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5tcS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMuZnIuYmluZCh0aGlzKSk7CmIub24oImFkc3RhcnQiLGZ1bmN0aW9uKGEpe3RoaXMuZXIoYSxiKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50JiYoYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLlR2KGIpfS5iaW5kKHRoaXMpKSxiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiLGZ1bmN0aW9uKCl7dGhpcy5VdihiKX0uYmluZCh0aGlzKSkpO2Iub24oImFkZW5kIixmdW5jdGlvbihhKXt0aGlzLmRyKGEsYil9LmJpbmQodGhpcykpO2Iub24oImNvbnRlbnRwbGF5YmFjayIsZnVuY3Rpb24oYSl7dGhpcy5lcChhKX0uYmluZCh0aGlzKSl9LGVwOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLkQoKX0sVHY6ZnVuY3Rpb24oYil7dGhpcy5HZHx8KHRoaXMuR2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZ2KGIpfS5iaW5kKHRoaXMpLHRoaXMuUXYpKX0sVnY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpO3RoaXMuRCgpfSwKVXY6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2QpfSxkcjpmdW5jdGlvbihiKXt0aGlzLlV3KGIpO3RoaXMuWmc9bmV3IERhdGU7dGhpcy5aZy10aGlzLkV0PHRoaXMuanY/dGhpcy5EKCk6dGhpcy5zKCl9LGZyOmZ1bmN0aW9uKGIsYSl7IWEmJmIudGFyZ2V0LnBsYXllciYmKGE9Yi50YXJnZXQucGxheWVyLHRoaXMudGQobmV3IFQoYSkpKTt0aGlzLkQoKX0sbXE6ZnVuY3Rpb24oKXt9LGVyOmZ1bmN0aW9uKCl7dGhpcy5FdD1uZXcgRGF0ZX19KX0pKGMpO3ZhciByYT1jLkRpfHxyYTsoZnVuY3Rpb24oYyl7Yy5GaT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxlLkxhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9Cm5ldyBUKGJbYV0pO3RoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IHJhKGcsdGhpcy5HKSkuYygpKX19dGhpcy5JKCl9fX0pfSkoYyk7dmFyIHNhPWMuRml8fHNhLHRhPW5ldyBzYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bT10aGlzLmFbOF07dGhpcy5ibz10aGlzLmFbNF07dGhpcy5zdz10aGlzLmFbM107dGhpcy5TaT10aGlzLmFbNF07dGhpcy5icj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVsxXX1jLkx2PWI7Yi5wcm90b3R5cGU9e3VtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy52bTp0aGlzLmFvKGEpfSxhbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYm86dGhpcy5ydyhhKX0scnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnN3OnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TaTp0aGlzLmFyKGEpfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLmJyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgdWE9Yy5Mdnx8dWEsZGQ9bmV3IHVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9ZGQudW0oNCk7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt0aGlzLmRnKCk7dGhpcy5mZygpO3RoaXMuZnA9ITF9LGRnOmZ1bmN0aW9uKCl7dGhpcy5KYj0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuSmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVShiKX0sZmc6ZnVuY3Rpb24oKXtpZighdGhpcy5KYil7dmFyIGI9dGhpcy5CYSgpLAphPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fCh0aGlzLkpiPSEwKTt0aGlzLlYoYSl9fSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKG0ucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWIuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5MJiYoMCx0aGlzLkwpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuTCYmKDAsdGhpcy5MKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmCmEucG9zaXRpb24mJjE+YS5kdXJhdGlvbi1hLnBvc2l0aW9uJiZ0aGlzLkwmJigwLHRoaXMuTCkoKX0uYmluZCh0aGlzKSl9LEJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMud2QoYSl9LmJpbmQodGhpcyl9KTtpZihiLm9uQWRFcnJvciliLm9uQWRFcnJvcihmdW5jdGlvbihhKXt0aGlzLndkKGEpfS5iaW5kKHRoaXMpKX0sd2Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiYKdGhpcy5DZSYmKDAsdGhpcy5DZSkoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2lmKCFiLmdldFN0YXRlfHwicGxheWluZyIhPWIuZ2V0U3RhdGUoKXx8dGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LGJiOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7CnJldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHZhPWMuaWt8fHZhOyhmdW5jdGlvbihjKXtjLmhrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LGViOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5DYzt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITF9LGM6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLkVjPSExO3RoaXMuUGQ9MTt0aGlzLkdjPVtdO3RoaXMuaWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzPwphLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLlBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5pYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuaWI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMuaWI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLmliPSEwKSk6dGhpcy5zKCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5zKCJhZENvbXBsZXRlIik7CnRoaXMuRWM9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkSW1wcmVzc2lvbiIpO3RoaXMuRmUoKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnMoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMucygiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlFnJiYhdGhpcy5rYSgpJiYodGhpcy5pYj8odGhpcy5vKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy51KCkpOih0aGlzLm8oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLnUoITApKSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmthKCkmJih0aGlzLmViKCksdGhpcy5nZXRQbGF5ZXIoKS5mcD0hMCxtLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkub2I7YSYmKGEubmQoKSxhLllkKCkpfX0uYmluZCh0aGlzKX0pO2lmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy5zKCJvbkFkQ29tcGxldGUiKTt0aGlzLkVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpOwppZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLnMoIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUWcmJiF0aGlzLmthKCkmJih0aGlzLmliPyh0aGlzLm8oImNvbnRlbnRwbGF5Tm9BZHMiLCIiKSx0aGlzLnUoKSk6KHRoaXMubygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMudSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5HYy5pbmRleE9mKGEpJiZ0aGlzLkdjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMucygpLHRoaXMuamEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT8KdGhpcy5zKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMucygiZW1wdHkiKToodGhpcy5vKCJhZGVycm9yIixiLmNvZGUpLHRoaXMuR2MubGVuZ3RoPj10aGlzLlBkJiZ0aGlzLnUoKSl9LGpzOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sdTpmdW5jdGlvbihiKXtiP3RoaXMuY2U/dGhpcy5jZSsrOnRoaXMuY2U9MTp0aGlzLmJlP3RoaXMuYmUrKzp0aGlzLmJlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLnRoKGEudmlkZW9UYWcpP2EuSmI/dGhpcy5zKCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5FY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMuYmU+dGhpcy5jZSYmKGI9ITEpLHRoaXMuRChiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksNTApOihhLmRnKCksYS5mZygpLGEuSmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoyMCkpfX0pfSkoYyk7dmFyIHdhPWMuaGt8fHdhOyhmdW5jdGlvbihjKXtjLmprPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPWUuR2EoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7aWYoIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCIhPXRoaXMuSXEoKXx8IWIuYXV0aG9yaXR5fHwhYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiYKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtqd3BsYXllcigpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBnPW5ldyB2YSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuSyhnKXx8dGhpcy5OcihnKXx8KHRoaXMuTShnKSxnPW5ldyB3YShnLHRoaXMuRyksZy5OKCksZy5jKCkpfX10aGlzLkkoKX19LGF4OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LElxOmZ1bmN0aW9uKCl7dmFyIGI9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS5rYihiLmFuY2hvcil9fSl9KShjKTt2YXIgeGE9Yy5qa3x8eGEseWE9bmV3IHhhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5JbT10aGlzLmFbM107dGhpcy5sPXRoaXMuYVs3XX1jLm90PWI7Yi5wcm90b3R5cGU9e0htOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5JbTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHphPWMub3R8fHphLGVkPW5ldyB6YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWVkLkhtKDQpOyhmdW5jdGlvbihjKXtjLk5tPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuVShiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYiYmYS5jb250cm9scyYmYS5jb250cm9scy5wbGF5ZXImJmEuY29udHJvbHMucGxheWVyLnBhdXNlP3RoaXMuVihiKTp0aGlzLkkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRyb2xzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciBBYT1jLk5tfHxBYTsoZnVuY3Rpb24oYyl7Yy5NbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiksCnRoaXMudSgpKX0sdTpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtiPXRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCl9Y2F0Y2goYSl7fWI/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgQmE9Yy5NbXx8QmE7KGZ1bmN0aW9uKGMpe2MuT209dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8ZS5MYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz0KbmV3IEFhKGcpLHRoaXMuSyhnKXx8KHRoaXMuTShnKSwobmV3IEJhKGcsdGhpcy5HKSkuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIENhPWMuT218fENhLERhPW5ldyBDYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zcj10aGlzLmFbOV07dGhpcy5hcD10aGlzLmFbOV07dGhpcy5xaz10aGlzLmFbN107dGhpcy5nbD10aGlzLmFbNl07dGhpcy5Mcz10aGlzLmFbMl07dGhpcy5Zcj10aGlzLmFbMl07dGhpcy5PaT10aGlzLmFbNl07dGhpcy4kaj10aGlzLmFbOV07dGhpcy51cD10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsxMF19Yy5YdD1iO2IucHJvdG90eXBlPXtycjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuc3I6dGhpcy4kbyhhKX0sJG86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFwOnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMucWs6dGhpcy5mbChhKX0sZmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmdsOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Mczp0aGlzLlhyKGEpfSxYcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXI6dGhpcy5OaShhKX0sTmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk9pOnRoaXMuWmooYSl9LFpqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJGo6dGhpcy50cChhKX0sdHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIEVhPWMuWHR8fEVhLGZkPW5ldyBFYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWZkLnJyKDQpOyhmdW5jdGlvbihjKXtjLkNtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5VKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlYoYik6dGhpcy5tYSgpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5mYihiKX0uYmluZCh0aGlzKSl9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/Yi5hdXRvcGxheSgpOiExfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sYmI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goZyl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5jdXJyZW50VGltZSlyZXR1cm4gYi5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIEZhPWMuQ218fEZhOyhmdW5jdGlvbihjKXtjLkJtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMucmE9dGhpcy5wYz10aGlzLiRhPXRoaXMuTWM9ITE7dGhpcy5maD1lLnNiKDEwKTt0aGlzLkhoPSEwO3RoaXMuVGQ9dGhpcy54Zz0hMTt0aGlzLlVnKCk7dGhpcy5RbygpO3RoaXMuTmEoKX0scHg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2NvbnNvbGUuaW5mbyh0aGlzLmdldFBsYXllcigpLmxiKCksIjsiLCJ3aW5kb3cuaW1hOiIsIjsiLHdpbmRvdy5pbWEsIjsiLHR5cGVvZiB3aW5kb3cuaW1hLCI7IiwicGxheWVyLmFkczoiLCI7IixiLlksIjsiLHR5cGVvZiBiLlksIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsCiI7IixiLlk/Yi5ZLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5ZP3R5cGVvZiBiLlkuc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5SLCI7Iix0eXBlb2YgYi5SLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuUj9iLlIuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnphOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnphOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuemE6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi56YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuemE/Yi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS56YT90eXBlb2YgYi5pbWEuemEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5SJiZiLlIuemE/Yi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IixiLlImJmIuUi56YT90eXBlb2YgYi5SLnphKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLkxkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi5MZDoKInVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5MZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLk1kOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuUj9iLlIuTWQ6InVuZGVmaW5lZFgiLCI7IixiLlI/dHlwZW9mIGIuUi5NZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS51YToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS51YToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNMb2FkZXI6IiwiOyIsYi5SP2IuUi51YToidW5kZWZpbmVkWCIsIjsiLGIuUj90eXBlb2YgYi5SLnVhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5TZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hPwp0eXBlb2YgYi5pbWEuU2Q6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLlI/Yi5SLlNkOiJ1bmRlZmluZWRYIiwiOyIsYi5SP3R5cGVvZiBiLlIuU2Q6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy5maCl9LG5iOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiZ0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXyYmMT09dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18uaW1hJiYodGhpcy5pbWE9dGhpcy5pbWEoKSx0aGlzLmltYS5jb250cm9sbGVyJiYodGhpcy5pbWE9dGhpcy5pbWEuY29udHJvbGxlcikpfWNhdGNoKGEpe319cmV0dXJuIHRoaXMuaW1hfSxiZDpmdW5jdGlvbigpe2lmKCF0aGlzLnVhKXt2YXIgYj0KdGhpcy5uYigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMudWE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMudWE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMudWE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMudWF9LG9nOmZ1bmN0aW9uKCl7aWYoIXRoaXMucGMpe3ZhciBiPXRoaXMubmIoKTtiJiYoYi5hZHNNYW5hZ2VyJiYodGhpcy5wYz1iLmFkc01hbmFnZXIpLGIuZ2V0QWRzTWFuYWdlciYmKHRoaXMucGM9Yi5nZXRBZHNNYW5hZ2VyKCkpKX1yZXR1cm4gdGhpcy5wY30sTHI6ZnVuY3Rpb24oKXtpZighdGhpcy53Zyl7dmFyIGI9dGhpcy5uYigpLGE9dGhpcy5KcigpO3dpbmRvdy5pbWEmJmImJihiLl9hZHNMb2FkZXJ8fGIuYWRzTG9hZGVyfHxhKSYmCih0aGlzLndnPSEwKX1yZXR1cm4gdGhpcy53Z30sSnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLk1jJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5NYz0hMCk7cmV0dXJuIHRoaXMuTWN9LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5iZCgpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixnPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJgooZz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5OYSgpfS5iaW5kKHRoaXMpLDIwKTooYi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKTt0aGlzLmFhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxQZTpmdW5jdGlvbigpe3RoaXMuVGQ9ITA7dmFyIGI9dGhpcy5vZygpO2lmKGJ8fHRoaXMua2EoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlBhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5iYz0hMDtpZihlLnFiKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwKIWEucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMuYmM9ITA7ZS5xYigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLmJjfHwodGhpcy5vKCJhZGVycm9yIiwibm9hZGV2ZW50IiksCnRoaXMuYWEoKSx0aGlzLnUoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSwkdzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuVWYmJmIuYWRzJiYodGhpcy5VZj1iLmFkcyk7cmV0dXJuIHRoaXMuVWZ9LFFvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpO3RoaXMuYWEoKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5hYSgpO3RoaXMubygiYWRlcnJvciIsdGhpcy5XKX0uYmluZCh0aGlzKSk7CmIub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLmFhKCk7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zKCk7dGhpcy5GZSgpfS5iaW5kKHRoaXMpKX0sWGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLm9nKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5YZigpfS5iaW5kKHRoaXMpLDUwKX0sVWc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuTHIoKSl7dmFyIGE9dGhpcy5uYigpLGc9dGhpcy5iZCgpO2EmJmcmJih0aGlzLm5iKCksdGhpcy5iZCgpLHRoaXMuVGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UZD90aGlzLnMoKToodGhpcy5hYSghMCksdGhpcy5vKCJub0Fkc01hbmFnZXIiLAoiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKTt0aGlzLm5iKCl9ZWxzZSB0aGlzLnhnP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYigpLGI9dGhpcy5iZCgpO2EmJiFiPyh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuYWEoKSk6KHRoaXMuYWEoITApLHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnhnPSEwO2IuaXNQbGF5aW5nKCkmJjEwPGIuY3VycmVudFRpbWUoKXx8dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWcoKX0uYmluZCh0aGlzKSw1MCl9LFo6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBnPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWc9ITA7Z3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fAooZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgZz1iLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYShnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUm86ZnVuY3Rpb24oKXt0aGlzLmdjfHwodGhpcy5nYz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmlmKGIuYWRzKXtpZih0aGlzLmdjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuZ2M9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuZ2Mpe3RoaXMucygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5nYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUm8oKX0uYmluZCh0aGlzKSwxMCl9LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7MDw9ZS5pZShkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5XP3RoaXMudSghMCk6KHRoaXMucmE9ITAsdGhpcy5zKCJlbXB0eSB2YXN0IikpfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmthKCl8fChifHwodGhpcy5IaD0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSGgsZnVuY3Rpb24oKXt0aGlzLlhmKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy5reHx8KDEwPHRoaXMuUnY/KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYWF6YSIpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYWEuYmluZCh0aGlzKSw1MDApKToodGhpcy5SdisrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLmV1KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldvKCl9LmJpbmQodGhpcyksNTApKSl9LGV1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLlN2KXt0aGlzLlN2PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubygiYWRlcnJvciIsCiJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIiwidnA6YWQtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmFhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lbmRlZCIrYSxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7CnZhciBHYT1jLkJtfHxHYTsoZnVuY3Rpb24oYyl7Yy5EbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSxhO2E9dGhpcy51aCh3aW5kb3cpO2Zvcih2YXIgZz0wO2c8Yi5sZW5ndGg7ZysrKXRyeXthPWF8fHRoaXMudWgoYltnXSl9Y2F0Y2goZCl7fXRoaXMuSSgpfX0sdWg6ZnVuY3Rpb24oYil7dmFyIGE9W107Yi52aWRlb2pzJiZiLnZpZGVvanMuZ2V0UGxheWVycz9hPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5MYShhKSl7Yj1hO2Zvcih2YXIgZyBpbiBiKWIuaGFzT3duUHJvcGVydHkoZykmJihhPW5ldyBGYShiW2ddKSxhLm9hfHx0aGlzLksoYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTShhKSwKKG5ldyBHYShhLHRoaXMuRykpLmMoKSkpO3JldHVybiEwfXJldHVybiExfSxJOmZ1bmN0aW9uKCl7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSx0aGlzLnVjKX19KX0pKGMpO3ZhciBIYT1jLkRtfHxIYSxJYT1uZXcgSGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGw9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzVdO3RoaXMud3Y9dGhpcy5hWzddO3RoaXMuamk9dGhpcy5hWzFdO3RoaXMubXU9dGhpcy5hWzVdO3RoaXMuYXM9dGhpcy5hWzEwXTt0aGlzLmxyPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzldfWMuV3I9YjtiLnByb3RvdHlwZT17S2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy55bDp0aGlzLnZ2KGEpfSx2djpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnd2OnRoaXMuaWkoYSl9LGlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qaTp0aGlzLmx1KGEpfSxsdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubXU6dGhpcy4kcihhKX0sJHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmFzOnRoaXMua3IoYSl9LGtyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5scjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEphPWMuV3J8fEphLGdkPW5ldyBKYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWdkLktsKDQpOyhmdW5jdGlvbihjKXtjLmRtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmdldFBsYXllcigpLmlkKTsKYi5nZXRXcmFwcGVyRWxlbWVudCYmKGE9Yi5nZXRXcmFwcGVyRWxlbWVudCgpKTt0aGlzLlUoYSk7KGE9Yi5nZXRQbGF5ZXIoKS5lbCl8fChhPWIuZ2V0UGxheWVyKCkpO3RoaXMuVihhKX0saWE6ZnVuY3Rpb24oKXt9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuZ2V0Q3VycmVudFRpbWUoKSxnPWIuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmcmJjA8ZyYmYT49Zy0yJiZ0aGlzLkwmJiJ1bmRlZmluZWQiPT09dHlwZW9mIGIuaXNQYXVzZWQoKSYmdGhpcy5MKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsiZmxhc2giPT1iLnBsYXllcl90eXBlP2IuZ2V0UGxheWVyKCkucGF1c2UoKTpiLmlzUGF1c2VkKCl8fGIuZ2V0UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5pc1BhdXNlZCgpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wbGF5KCk6CmIuaXNQYXVzZWQoKSYmKHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucGxheS5iaW5kKHRoaXMpLDApLGIuZ2V0UGxheWVyKCkucGxheSgpKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lIn0saGE6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPXRoaXMucGxheWVyLnBsYXllcjthLmlzTXV0ZWQmJmEuaXNNdXRlZCgpJiYoYj0hMCk7cmV0dXJuIGJ9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPTEwMCpiLmdldFZvbHVtZSgpKTtyZXR1cm4gYX19KX0pKGMpO3ZhciBLYT1jLmRtfHxLYTsoZnVuY3Rpb24oYyl7Yy5jbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5HYj1udWxsO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5VYj0hMTt0aGlzLmhoKCk7aWYoYi5nZXRQbGF5ZXIoKS5hZF9lcnJvcnx8Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQpe3ZhciBhPQpiLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2IuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFhJiYoYT0iYWRfZXJyb3IiKTtiLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWEmJihhPSJhZF9mYWlsZWQiKTtpZig5MDE9PWEpdGhpcy5zKCk7ZWxzZXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSl0aGlzLlViPSEwLHRoaXMucygpO3RoaXMubygiYWRlcnJvciIsYSk7Yi5nZXRQbGF5ZXIoKTtiLmdldFBsYXllcigpO3RoaXMuUmMoKX19ZWxzZSJmbGFzaCI9PWIucGxheWVyX3R5cGU/dGhpcy5QZigpOnRoaXMucygpfSxSYzpmdW5jdGlvbihiKXtpZighdGhpcy5rYSgpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuZ2V0UGxheWVyKCk7aWYoInBsYXlpbmciPT1hLmdldFBsYXllcigpLnN0YXRlKWlmKGEuZ2V0UGxheWVyKCksYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLmFkX2Vycm9yfHxhLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGc9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTsKYS5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWcmJihnPSJhZF9lcnJvciIpO2EuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhZyYmKGc9ImFkX2ZhaWxlZCIpO2lmKDkwMT09Zyl0aGlzLnMoKTtlbHNle2lmKDEwMDk9PWd8fDMwMz09Z3x8NDAzPT1nKXRoaXMuVWI9ITAsdGhpcy5zKCk7dGhpcy5vKCJhZGVycm9yIixnKTthLmdldFBsYXllcigpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTt0aGlzLlViP3RoaXMuamEoKTpiP2EuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU/dGhpcy5EKDEwMTIhPWEuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGUpOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5EKCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5zKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuUmMuYmluZCh0aGlzKSwKMTAwKX19LFBmOmZ1bmN0aW9uKCl7aWYoIXRoaXMua2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsiYWRMb2FkaW5nRW1wdHkiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuR2IpLHRoaXMucygpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5HYiksdGhpcy5zKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLkdiKSx0aGlzLnMoKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLkdiJiYodGhpcy5HYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVWJ8fAoodGhpcy5vKCJhZGVycm9yIiwiYWRMb2FkaW5nRXJyb3IiKSx0aGlzLkQoKSl9LmJpbmQodGhpcyksMjAwKSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5QZi5iaW5kKHRoaXMpLDUwKX19LGhoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5nZXRQbGF5ZXIoKTtiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLm8oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuVWI9ITAsdGhpcy5zKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiYKdGhpcy5zKCl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5oaCgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBMYT1jLmNtfHxMYTsoZnVuY3Rpb24oYyl7Yy5lbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cudmlkZW8mJnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgS2EodmlkZW8pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IExhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBNYT1jLmVtfHxNYSxOYT1uZXcgTWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubmo9dGhpcy5hWzldO3RoaXMuUW09dGhpcy5hWzddO3RoaXMuV249CnRoaXMuYVsxMF07dGhpcy5zcz10aGlzLmFbMV07dGhpcy5odD10aGlzLmFbN107dGhpcy5IcD10aGlzLmFbMl07dGhpcy5rbj10aGlzLmFbNl07dGhpcy5sPXRoaXMuYVs1XX1jLnNqPWI7Yi5wcm90b3R5cGU9e21qOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5uajp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUW06dGhpcy5WbihhKX0sVm46ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlduOnRoaXMucnMoYSl9LHJzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5zczp0aGlzLmd0KGEpfSxndDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuaHQ6dGhpcy5HcChhKX0sR3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhwOnRoaXMuam4oYSl9LGpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5rbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9hPWMuc2p8fE9hLGhkPQpuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1oZC5taig0KTsoZnVuY3Rpb24oYyl7Yy5hbT1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5lbF87YXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBiLmVsP2E9Yi5lbCgpOiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKCkpKSk7dGhpcy5VKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYoYj1iWzBdKTt0aGlzLlYoYil9LGZiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkwmJnRoaXMuTCgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthfHxiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIGIucGF1c2VkJiYoYT1iLnBhdXNlZCgpKTthJiZiLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJ0b25saW5lMiJ9LGhhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLmdldFJhd1BsYXllcigpO2EubXV0ZWQmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLm11dGVkJiYoYj1hLm11dGVkKCkpO3JldHVybiBifSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0hMTtiLnZvbHVtZSYmImZ1bmN0aW9uIj09dHlwZW9mIGIudm9sdW1lJiYoYT0xMDAqYi52b2x1bWUoKSk7cmV0dXJuIGF9LGJiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSExOyJmdW5jdGlvbiI9PXR5cGVvZiBiLnBhdXNlZCYmCihhPWIucGF1c2VkKCkpO2F8fGIucGF1c2UoKX19KX0pKGMpO3ZhciBQYT1jLmFtfHxQYTsoZnVuY3Rpb24oYyl7Yy4kbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLk9mKCk7Yi5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMDt0aGlzLm1ufHx0aGlzLmthKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCJ0aW1ldXBkYXRlIik7dGhpcy5EKCEwKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJWaWRlb1BsYXllcjo6QURfRklSU1RfUVVBUlRJTEUiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Iub24oIlZpZGVvUGxheWVyOjpBRF9NSURQT0lOVCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiVmlkZW9QbGF5ZXI6OkFEX1RISVJEX1FVQVJUSUxFIiwKZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMubygiYWRzZXJyb3IiKTt0aGlzLmNyKGEpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sY3I6ZnVuY3Rpb24oYil7dmFyIGE9OTk5OTk5O2lmKGIuZGF0YSYmYi5kYXRhLkFkRXJyb3IpZm9yKHZhciBnIGluIGIuZGF0YS5BZEVycm9yKWIuZGF0YS5BZEVycm9yLmhhc093blByb3BlcnR5KGcpJiYibnVtYmVyIj09dHlwZW9mIGIuZGF0YS5BZEVycm9yW2ddJiYoYT1iLmRhdGEuQWRFcnJvcltnXSx0aGlzLm8oYSkpOzkwMT09YT90aGlzLnMoKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy5VYj0hMCx0aGlzLnMoKSx0aGlzLmphKCkpOnRoaXMuRCgpfSxPZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZHMmJmIuYWRzLmlzQWRQbGF5aW5nJiZiLmFkcy5pc0FkUGxheWluZygpPwoodGhpcy5tbj0hMCx0aGlzLnMoKSk6dGhpcy5rYSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk9mLmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nP3RoaXMuRChiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIFFhPWMuJGx8fFFhOyhmdW5jdGlvbihjKXtjLmJtPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wbGF5ZXJGcmFtZXdvcmsuZ2V0QmFzZSl7dmFyIGI9d2luZG93LnBsYXllckZyYW1ld29yay5nZXRCYXNlKCk7aWYoYiYmYi5nZXRBbGxQbGF5ZXJzJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBbGxQbGF5ZXJzKWlmKChiPQpiLmdldEFsbFBsYXllcnMoKSkmJmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1uZXcgUGEoYlthXSk7dGhpcy5LKGcpfHwodGhpcy5NKGcpLChuZXcgUWEoZyx0aGlzLkcpKS5jKCkpfWVsc2UgdGhpcy5JKCl9ZWxzZSB0aGlzLlFlKCksdGhpcy5JKCl9fSl9KShjKTt2YXIgUmE9Yy5ibXx8UmEsU2E9bmV3IFJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmd2PXRoaXMuYVs3XTt0aGlzLkpwPXRoaXMuYVsyXTt0aGlzLnlqPXRoaXMuYVs4XTt0aGlzLnl2PXRoaXMuYVs2XTt0aGlzLnJxPXRoaXMuYVsxXTt0aGlzLkN0PXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLm9qPWI7Yi5wcm90b3R5cGU9e2Z2OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ndjp0aGlzLklwKGEpfSxJcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSnA6CnRoaXMueGooYSl9LHhqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy55ajp0aGlzLnh2KGEpfSx4djpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueXY6dGhpcy5xcShhKX0scXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnJxOnRoaXMuQnQoYSl9LEJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5DdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIFRhPWMub2p8fFRhLGlkPW5ldyBUYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWlkLmZ2KDQpOyhmdW5jdGlvbihjKXtjLmxpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIpO3RoaXMuVGc9YX0sTjpmdW5jdGlvbigpe30semU6ZnVuY3Rpb24oYil7dGhpcy5UZz1iO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UZykucGFyZW50Tm9kZTsKdGhpcy5VKGIpO3RoaXMuVihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQkNGbGFzaE9ubHkifX0pfSkoYyk7dmFyIFVhPWMubGl8fFVhOyhmdW5jdGlvbihjKXtjLmtpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSxnKXt0aGlzLmV4cGVyaWVuY2U9Zzt0aGlzLmkoYixhKX0semU6ZnVuY3Rpb24oYil7dGhpcy5leHBlcmllbmNlPWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5FWFBFUklFTkNFKTt2YXIgYj10aGlzLmV4cGVyaWVuY2UuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSxhPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5BRFZFUlRJU0lORyk7CmIuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuQkVHSU4sZnVuY3Rpb24oKXt0aGlzLm8oImNvbnRlbnRwbGF5Iik7dGhpcy5EKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihCQ01lZGlhRXZlbnQuUExBWSxmdW5jdGlvbigpe3RoaXMubygiY29udGVudHBsYXkiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKEJDQWR2ZXJ0aXNpbmdFdmVudC5BRF9QUk9HUkVTUyxmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBWYT1jLmtpfHxWYTsoZnVuY3Rpb24oYyl7Yy5taT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuYnJpZ2h0Y292ZSYmd2luZG93LmJyaWdodGNvdmUuZXhwZXJpZW5jZXMpe3ZhciBiPWJyaWdodGNvdmUuZXhwZXJpZW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJyaWdodGNvdmUuZ2V0RXhwZXJpZW5jZShhKSwKZD0hMTtnJiYoZD1nLmdldE1vZHVsZShBUElNb2R1bGVzLlZJREVPX1BMQVlFUikpO2lmKGcmJmQmJmQuaXNQbGF5ZXJEZWZpbmVkKCkpZD1uZXcgVWEoZCxhKSx0aGlzLksoZCl8fChkLnplKGEpLHRoaXMuTShkKSxkPW5ldyBWYShkLHRoaXMuRyxnKSxkLnplKGcpLGQuYygpKTtlbHNle3RoaXMuSSgpO3JldHVybn19fXRoaXMuSSgpfX0pfSkoYyk7dmFyIFdhPWMubWl8fFdhLFhhPW5ldyBXYShpYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSGk9dGhpcy5hWzNdO3RoaXMuQ3c9dGhpcy5hWzVdO3RoaXMuVHM9dGhpcy5hWzZdO3RoaXMuQWo9dGhpcy5hWzNdO3RoaXMuU2o9dGhpcy5hWzJdO3RoaXMuWXA9dGhpcy5hWzZdO3RoaXMuRGs9dGhpcy5hWzRdO3RoaXMuWm89dGhpcy5hWzJdO3RoaXMuRHA9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzVdfWMuQnA9YjtiLnByb3RvdHlwZT0Ke0dpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5IaTp0aGlzLkJ3KGEpfSxCdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3c6dGhpcy5TcyhhKX0sU3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlRzOnRoaXMuemooYSl9LHpqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Bajp0aGlzLlJqKGEpfSxSajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU2o6dGhpcy5YcChhKX0sWHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllwOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLllvKGEpfSxZbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm86dGhpcy5DcChhKX0sQ3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkRwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMubDphfX19KShjKTt2YXIgWWE9Yy5CcHx8WWEsamQ9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWpkLkdpKDQpOyhmdW5jdGlvbihjKXtjLk5rPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLlUoYik7dGhpcy5WKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sUGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmCjA8JCgiYm9keS5kZXZpY2VfbW9iaWxlIikubGVuZ3RoJiYoYj0hMCk7cmV0dXJuIGJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iTmlja0dhbWVMb2FkZXIifX0pfSkoYyk7dmFyIFphPWMuTmt8fFphOyhmdW5jdGlvbihjKXtjLk1rPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlBhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMuRmMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLkZjKCl9LmJpbmQodGhpcykpKTp0aGlzLkZjKCl9LEZjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkPwpiLmFkQ29udGV4dC5fYWRSZXNwb25zZT90aGlzLnMoKToodGhpcy5vKCJhZGVycm9yIiwibm9BZFJlc3BvbnNlIiksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYy5iaW5kKHRoaXMpLDIwMCl9fSl9KShjKTt2YXIgJGE9Yy5Na3x8JGE7KGZ1bmN0aW9uKGMpe2MuT2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBaYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3ICRhKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBhYj1jLk9rfHxhYixiYj1uZXcgYWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT249dGhpcy5hWzFdO3RoaXMuUWo9dGhpcy5hWzldOwp0aGlzLkp3PXRoaXMuYVs3XTt0aGlzLm5yPXRoaXMuYVsyXTt0aGlzLmw9dGhpcy5hWzEwXX1jLnRqPWI7Yi5wcm90b3R5cGU9e05uOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Pbjp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5JdyhhKX0sSXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkp3OnRoaXMubXIoYSl9LG1yOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ucjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGNiPWMudGp8fGNiLGtkPW5ldyBjYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPWtkLk5uKDQpOyhmdW5jdGlvbihjKXtjLnZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuSGU9CjA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5tYSgpO3JldHVybn10aGlzLlUoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuVihiKTp0aGlzLm1hKCl9LEZ0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMub2IsZz10aGlzLmxiKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLkliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLm5kKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5IZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8KKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxiYjpmdW5jdGlvbigpe3RoaXMuSGUrKztpZigxMDx0aGlzLkhlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLAp3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sClA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGlhOmZ1bmN0aW9uKCl7fSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkwmJnRoaXMuTCgpfX0pfSkoYyk7dmFyIGRiPWMudmx8fGRiOyhmdW5jdGlvbihjKXtjLnVsPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LCRhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5wYisrLDE1PHRoaXMucGIpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMudSghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5mZT0KITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSk7dGhpcy5EYSgpfHwodGhpcy5vKCJhZGVycm9yIix0aGlzLlcpLHRoaXMudSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGEoKX0uYmluZCh0aGlzKSwxMCl9fSxEYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJhfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fAo0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVz1hLGIubygiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksCnRoaXMpKXt0aGlzLnhhKCk7YnJlYWt9fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlc9dGhpcy5XfHwhMTt0aGlzLiRhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLmtxPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIix0aGlzLlcpO3RoaXMudSgpfS5iaW5kKHRoaXMpKSx0aGlzLmtxPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5GdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jKCl9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgZWI9Yy51bHx8ZWI7KGZ1bmN0aW9uKGMpe2Mud2w9CnQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuRmE9MTUwMDt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgZGIod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2Eub2F8fHRoaXMuSyhhKXx8KHRoaXMuTShhKSwobmV3IGViKGEsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBmYj1jLndsfHxmYixnYj1uZXcgZmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlJwPXRoaXMuYVsxMF07dGhpcy5Zcz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs1XX1jLlBvPWI7Yi5wcm90b3R5cGU9e1FwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ScDp0aGlzLlhzKGEpfSxYczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWXM6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBoYj1jLlBvfHxoYixsZD1uZXcgaGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1sZC5RcCg0KTsoZnVuY3Rpb24oYyl7Yy5Faj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVShiLmVsZW1lbnQpO3RoaXMuVihiLmVsZW1lbnQpfSxOYjpmdW5jdGlvbigpe3JldHVybiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VwbGF5ZXIoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgaWI9Yy5Fanx8aWI7KGZ1bmN0aW9uKGMpe2MuRGo9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5kZXRhaWwmJiIxMDEwIj09Yi5kZXRhaWwuY29kZSYmYS5pbXByZXNzaW9uJiZhLmltcHJlc3Npb24oKX0uYmluZCh0aGlzKSk7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCgpfX0pfSkoYyk7dmFyIGpiPWMuRGp8fGpiOyhmdW5jdGlvbihjKXtjLkZqPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCmM6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgaWIoYi5kZXRhaWwpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGpiKGIsdGhpcy5HKSkuYygpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIga2I9Yy5Ganx8a2IsbGI9bmV3IGtiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlVuPXRoaXMuYVs2XTt0aGlzLkhyPXRoaXMuYVs3XTt0aGlzLnV3PXRoaXMuYVs5XTt0aGlzLnh3PXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzhdfWMudWo9YjtiLnByb3RvdHlwZT17VG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlVuOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Icjp0aGlzLnR3KGEpfSx0dzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudXc6CnRoaXMud3coYSl9LHd3OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBtYj1jLnVqfHxtYixtZD1uZXcgbWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1tZC5Ubig0KTsoZnVuY3Rpb24oYyl7Yy5maz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9ZS5tZyhiLCJlbGVtZW50SUQiKTt0aGlzLmFoPWIucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9CmIuaGVpZ2h0O2cuc3R5bGUubWF4SGVpZ2h0PWIuaGVpZ2h0O2cuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7ImJlZm9yZSI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEpOiJhZnRlciI9PXRoaXMuYWg/YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShnLGEubmV4dFNpYmxpbmcpOmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZyxhKTt0aGlzLlUoZyk7dGhpcy5WKGcpO3RoaXMuWmM9Z30scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlpjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5aYyl9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFZvOmZ1bmN0aW9uKCl7ZS5FZyh0aGlzLlpjKTtlLnBlKHRoaXMuWmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WbygpfS5iaW5kKHRoaXMpLDUwKX0sUDpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSx2ZTpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7CnZhciBuYj1jLmZrfHxuYjsoZnVuY3Rpb24oYyl7Yy5laz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy5vKCJleHRlcm5hbCIpO3RoaXMuRCghMCl9fSl9KShjKTt2YXIgb2I9Yy5la3x8b2I7KGZ1bmN0aW9uKGMpe2MuZ2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5GYT0xNTAwO3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUubWcoYiwiZWxlbWVudElEIik7ZS5FZyhhKSYmKGI9bmV3IG5iKGIpLHRoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IG9iKGIsdGhpcy5HKSkuYygpKSk7dGhpcy53Yj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmMuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy53Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgcGI9Yy5na3x8cGIscWI9bmV3IHBiKHEpO2M9Y3x8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Bcj10aGlzLmFbMl07dGhpcy5YaD10aGlzLmFbNF07dGhpcy5DbD10aGlzLmFbNl07dGhpcy5Zaz10aGlzLmFbMl07dGhpcy5sPXRoaXMuYVsyXX1jLlBzPWI7Yi5wcm90b3R5cGU9e3pyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Bcjp0aGlzLldoKGEpfSxXaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWGg6dGhpcy5CbChhKX0sQmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5DbDp0aGlzLlhrKGEpfSxYazpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubDphfX19KShjKTt2YXIgcmI9Yy5Qc3x8cmIsbmQ9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwKIlooVFREWlRSUiIpO3dpbmRvdy5GPW5kLnpyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Laj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSx3dTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LHRuOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB4PWMuS2p8fHg7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5TYT1hO3RoaXMuaGc9dGhpcy5SaD0hMTt0aGlzLlZnPWQ7dGhpcy52aD0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5TYT1uZXcgeChhKSk7dmFyIGU9dGhpcy56Yj1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vbnJlYWR5c3RhdGVjaGFuZ2U9CmZ1bmN0aW9uKCl7IWd8fDQhPWUucmVhZHlTdGF0ZXx8MjAwIT1lLnN0YXR1cyYmMjAxIT1lLnN0YXR1c3x8ZyhlKTtpZihkJiY0PT1lLnJlYWR5U3RhdGUmJjIwMCE9ZS5zdGF0dXMmJjIwMSE9ZS5zdGF0dXMpZChlKTtlbHNlIGlmKDQ9PWUucmVhZHlTdGF0ZSYmMD09ZS5zdGF0dXMmJmwmJmwudGUodGhpcy5TYS51cmwpJiZsLkJkKXt2YXIgaD1uZXcgeChhLnVybCk7aC53dSgiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmxhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bC5sYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9ZS5yZWFkeVN0YXRlJiZjKGUpfS5iaW5kKHRoaXMpfWMuTGo9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy52aD90aGlzLnpiLm9wZW4odGhpcy5TYS5tZXRob2QsdGhpcy5TYS51cmwsITEpOnRoaXMuemIub3Blbih0aGlzLlNhLm1ldGhvZCx0aGlzLlNhLnVybCwhMCksdGhpcy5SaHx8KHRoaXMuemIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnpiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLHRoaXMuemIuc2VuZChhKX1jYXRjaChjKXtsJiZsLnRlKHRoaXMuU2EudXJsKT9sLkJkP2wubGEoInJlcXVlc3RfZmFpbGVkIik6ZS50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOmwudGUodGhpcy5TYS51cmwpLAp0aGlzLlZnJiZ0aGlzLlZnKCl9cmV0dXJuIHRoaXMuemJ9fX0pKGMpO3ZhciBzYj1jLkxqfHxzYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMucWE9ITE7dGhpcy5kYz0iIjt0aGlzLlVkPXRoaXMuY2M9dGhpcy5qYj1udWxsO3RoaXMucnA9dGhpcy51Yj10aGlzLkxnPSExO3RoaXMuQ2E9IiI7dGhpcy5HZz0hMTt0aGlzLnlhPXRoaXMuZWQ9IiI7dGhpcy5DZz10aGlzLmJhPXRoaXMuaXNFbmFibGVkPXRoaXMuTmU9ITE7dGhpcy53YT1bXTt0aGlzLnVnPXRoaXMuUGI9IiI7dGhpcy5hZT0hMTt0aGlzLmFmPTA7dGhpcy5xZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLm9mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5BYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5CYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5wZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiOwp0aGlzLlJiPSIiO3RoaXMudmI9W107dGhpcy5TYj1bXTt0aGlzLlFiPSIiO3RoaXMuYmY9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5tZT0hMTt0aGlzLlhvPXRoaXMuQ2Q9bnVsbDt0aGlzLnJoPXRoaXMuemM9dGhpcy5hZz10aGlzLmVmPXRoaXMuQmQ9dGhpcy5WZD10aGlzLkRjPSExO3RoaXMuVmE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fWMuTWo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMucWEsYWR0YWdwYXJhbWV0ZXI6dGhpcy5kYyxhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLmNjLGFkdGFncmVnZXg6dGhpcy5VZCxqc3BvcHVwczp0aGlzLkxnLHNpZGVsb2Fkczp0aGlzLnViLGRpc2FibGV0ZXN0czp0aGlzLnJwLGhvbWFkQWxpYXM6dGhpcy5DYSxpc0luaXRpYWxpemVkOnRoaXMuR2csZ2xvYmFsQ29uZmlnOnRoaXMuZWQsY2xpZW50Q29uZmlnOnRoaXMueWEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLAppc1ZlcmlmaWVkOnRoaXMuYmEsaXNCbG9ja2VkOnRoaXMuQ2csc2VydmVyOnRoaXMud2Esc3ZtQ29uZmlnOnRoaXMuUGIsaG9tYWRBZHBhdGg6dGhpcy51ZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmFlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLmFmLEhPTUFEX1ZFUklGSUVEOnRoaXMucWYsSE9NQURfQkxPQ0tFRDp0aGlzLm9mLEhPTUFEX05PQkxPQ0tFUjp0aGlzLkFiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLkJjLEhPTUFEX0NPT0tJRUJMT0NLRVI6dGhpcy5wZix0ZXN0SGlkZTp0aGlzLlJiLHRlc3RUYWdzOnRoaXMudmIsdGVzdFRhZ3NKUzp0aGlzLlNiLHRlc3RDb29raWU6dGhpcy5RYix0aHJvdHRsZTp0aGlzLmJmLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMubWUsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5YbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLkRjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5WZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5CZCwKdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuZWYsY29uZmlnRmFpbHVyZXM6dGhpcy5WYSxzaXRlQ29uZmlnOnRoaXMuT2Isc2VydmVySWQ6dGhpcy5taCxlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuaWMsdnBhaWQ6dGhpcy56Yyxza2lwQWxsb3dlZDp0aGlzLnJofX0saHI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuVmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5WYVtiXSYmMT09dGhpcy5WYVtiXSYmKGE9ITApO3JldHVybiBhfSxSZTpmdW5jdGlvbihhKXt0aGlzLlZhW2FdPSEwfSxKcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5WYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlZhW2JdJiYxPT10aGlzLlZhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LHpkOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvCjFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5zYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1lLnJvKGEpfSx2YTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZT0iIixoPSIiLGs9IiI7aWYoIXRoaXMucWEmJiFiKXJldHVybiBuZXcgeChhKTtjPXRoaXMuc2UoYSk7ZT10aGlzLkdhKGEpO2M/KHRoaXMucmMoKT9oPWE6aD1lLnByb3RvY29sKyI6Ly8iK2UuYXV0aG9yaXR5KyIvIixrPWUucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMucmQoKSxrPWUucGF0aC5zdWJzdHIoMSkrKGUucXVlcnk/Ij8iK2UucXVlcnk6IiIpKTtkJiYodGhpcy5kY3x8dGhpcy5qYnx8CnRoaXMuY2N8fHRoaXMuVWQpJiYoaz10aGlzLnVzKGspKTthPW5ldyB4KGgpO2EudXJsPWg7aD0iIjtoPWM/ZS5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuTHEoZS5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMua2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxzZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMucmMoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpOwpyZXR1cm4gYn0scmM6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMud2EmJnRoaXMud2EubGVuZ3RoJiYwPHRoaXMud2EubGVuZ3RoJiYoYj10aGlzLndhWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LHRlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuc2UoYSk7cmV0dXJuIGJ9LExxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5DYSYmMDx0aGlzLkNhLmxlbmd0aClyZXR1cm4gdGhpcy5DYTtmb3IoZCBpbiB0aGlzLkNhKWlmKGI9dGhpcy5DYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT0KYSlyZXR1cm4gYi5TdztyZXR1cm4ibm9uZSJ9LGdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud2FbdGhpcy5taF19LHJkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZCgpLGI9dGhpcy5xaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxSZzpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGMpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSx0czpmdW5jdGlvbihhLGIpe3ZhciBkPWUuR2EoYSksYz0iIixjPSIiLGg7Zm9yKGggaW4gYil7aWYoYltoXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgQT1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtoXSkuc3BsaXQoIiYiKSwKYz17fSxrPTA7azxBLmxlbmd0aDtrKyspe3ZhciByPUFba10uc3BsaXQoIj0iKTtjW3JbMF1dPXJbMV19Zm9yKHZhciBsIGluIGJbaF0uc3VidmFsdWVzKWNbbF09dGhpcy5SZyhjW2xdLGwsYltoXS5zdWJ2YWx1ZXNbbF0pO0E9W107Zm9yKGwgaW4gYylBLnB1c2gobCsiPSIrY1tsXSk7Yz1BPWVuY29kZVVSSUNvbXBvbmVudChBLmpvaW4oIiYiKSl9ZWxzZSBjPXRoaXMuUmcoZC5xdWVyeUtleVtoXSxoLGJbaF0pO2QucXVlcnlLZXlbaF09Y31sPVtdO2ZvcihoIGluIGQucXVlcnlLZXkpbC5wdXNoKGgrIj0iK2QucXVlcnlLZXlbaF0pO3JldHVybiBjPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSx1czpmdW5jdGlvbihhKXt0aGlzLmRjJiYoYSs9dGhpcy5kYyk7aWYodGhpcy5qYilmb3IodmFyIGIgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmpiW2JdKSk7dGhpcy5jYyYmKGE9dGhpcy50cyhhLHRoaXMuY2MpKTtyZXR1cm4gYX0sCmY6ZnVuY3Rpb24oYSxiLGQsYyxlLGgpe2w9dGhpczt0aGlzLkdnPSEwO3RoaXMuZWQ9YTt0aGlzLnlhPWI7dGhpcy5OZT1kO3RoaXMuQ2Q9Yzt0aGlzLlhjPWU7dGhpcy5PYj1ofHx7fTt0aGlzLmVzKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnlhKXRoaXMuY3MoKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMueWEpdHJ5e3RoaXMueWE9YigpLHRoaXMuU2MoKX1jYXRjaChrKXt0aGlzLmxhKCJub0NsaWVudENvbmZpZyIpfX0sYWI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LGVzOmZ1bmN0aW9uKCl7dGhpcy5FYShuZXcgeCh0aGlzLmVkK3RoaXMuS2MoImdsb2JhbCIpKSx0aGlzLiRxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlJlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJgp0aGlzLlNjKCl9LmJpbmQodGhpcyksITApfSxjczpmdW5jdGlvbigpe25ldyB4KHRoaXMueWErdGhpcy5LYygiY2xpZW50IikpO3RoaXMuRWEobmV3IHgodGhpcy55YSt0aGlzLktjKCJjbGllbnQiKSksdGhpcy5TYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5SZSgiY2xpZW50Iik7dGhpcy5sYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sS2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMuc2IoKTt0aGlzLk9iJiZ0aGlzLk9iLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5PYiYmdGhpcy5PYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGxhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlZkKXt0aGlzLlZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmCmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9Owp0aGlzLlhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuWGM/dGhpcy5YYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5iYT10aGlzLkNnPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5hYih0aGlzLm9mKSk7dGhpcy54YigpO2UuamMoay53dCk7KGI9ZS5pZSh0aGlzLmdkKCkpKXx8KGI9ZS5pZShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sJHE6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe3ZhciBiPXt9O3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGMpe2IuZW5hYmxlZD0iZmFsc2UifXRoaXMuaXNFbmFibGVkPXRoaXMuVGIoYi5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMueWF8fHRoaXMuUGJ8fHRoaXMuQ2F8fHRoaXMuU2MoKToodGhpcy5xYT10aGlzLmlzRW5hYmxlZD0KITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9fSxTYzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnlhfWVsc2UgYT10aGlzLnlhO3RoaXMuaXNFbmFibGVkPXRoaXMuVGIoYS5lbmFibGVkKTt0aGlzLmJhPSF0aGlzLmlzRW5hYmxlZDt0aGlzLndhPWEuc2VydmVyfHxbXTtmb3IoYj0wO2I8dGhpcy53YS5sZW5ndGg7YisrKXRoaXMud2FbYl09dGhpcy53YVtiXS5yZXBsYWNlKCJkYW1vaC53aWtpYS5jb20iLCJkYW1vaC53aWtpYS5jb20uc3Zvbm0tYWxpYXMuY29tIik7dGhpcy5QYj1hLmNvbmZpZ3x8IiI7dGhpcy5DYT1hLmFsaWFzfHxudWxsO3RoaXMudWc9YS5hZHBhdGh8fCIiO3RoaXMuYWU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5taD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy53YS5sZW5ndGgpOwp0aGlzLmlzRW5hYmxlZCYmdGhpcy5QYiYmdGhpcy5DYSYmdGhpcy53YS5sZW5ndGg/dGhpcy5rZCghMSk6KHRoaXMucWE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5iYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpLHRoaXMueGIoKSl9LGtkOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmJhKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeCh0aGlzLnJkKCkpLGM9dGhpcy5HYSh0aGlzLlBiKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWMucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB4KHRoaXMuUGIrdGhpcy5LYygiY3VzdG9tZXIiKSk7dGhpcy5FYShiLHRoaXMuU3UuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuUmUoImN1c3RvbWVyIik7CmE/dGhpcy5UbD90aGlzLmxhKCJub1NWTUNvbmZpZyIpOih0aGlzLlRsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rZCghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5rZCghMCl9LmJpbmQodGhpcyksITApfX0sU3U6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuYmEpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5CZD10aGlzLlRiKGIuc3RyaWN0KTt0aGlzLmVmPXRoaXMuVGIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuYWc9Yi5kdXJhdGlvbl9jaGVja19wZW5hbHR5X2Rpc2FibGVkfHwhMTt0aGlzLmljPXRoaXMuVGIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLlRiKGIuZW5hYmxlZCk7dGhpcy5SYj1iLnRlc3RoaWRlfHwiIjt0aGlzLnZiPWIudGVzdGFkdGFnc3x8W107dGhpcy5TYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLmRjPQpiLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLmNjPWIuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5VZD1iLmFkdGFncmVnZXh8fG51bGw7dGhpcy5MZz1iLmpzcG9wdXBzfHwhMTt0aGlzLnViPWIuc2lkZWxvYWRzfHwhMTt0aGlzLnpjPWIudnBhaWR8fCExO3RoaXMuT2IudnBhaWQ9dGhpcy56Yzt0aGlzLnJoPWIuc2tpcGFsbG93ZWR8fCExO3RoaXMuUGM9Yi5jYXB0aW9uX2R1cmF0aW9ufHwhMTt0aGlzLlFiPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuVHEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmFlJiYodGhpcy5RYj1udWxsKTt0aGlzLmJmPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMubWUmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1lPSEwLHRoaXMua2QoITApKToKdGhpcy5pc0VuYWJsZWQmJiF0aGlzLml2KCkmJih0aGlzLlJifHx0aGlzLlNifHx0aGlzLnZifHx0aGlzLlFiKT90aGlzLk5lPyh0aGlzLnFhPXRoaXMuYmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKSx0aGlzLldkKCksdGhpcy54YigpKTp0aGlzLlh1KCk6KHRoaXMuaXNFbmFibGVkPSExLHRoaXMuWXUoKSl9fSxYdTpmdW5jdGlvbigpe3RoaXMuV3UoKTt0aGlzLlp1KCl9LFp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0KImlubGluZWV2YWxkYXRhIixjPTA7dHJ5e3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Yud2lkdGg9MTtmLmhlaWdodD0xO2Yuc3R5bGUuZGlzcGxheT0ibm9uZSI7Zi5zcmM9ImFib3V0OmJsYW5rIjt2YXIgaD1lLmVhKDEwKSxBPWUuZWEoMTApLGs9ZS5lYSgxMCk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7YysrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEEsZnVuY3Rpb24oKXtjKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoayxmdW5jdGlvbigpe2MrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKGspKwphdG9iKCJQQzl6WTNKcGNIUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUG1WMllXd29JZz09IikrYShBKSthdG9iKCJJaWs4TDNOamNtbHdkRDQ4YzJOeWFYQjBJSFI1Y0dVOUluUmxlSFF2YW1GMllYTmpjbWx3ZENJZ2MzSmpQU0prWVhSaE9uUmxlSFF2YW1GMllYTmpjbWx3ZER0aVlYTmxOalFzIikrZS5rYihhKGgpKSthdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGwpe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZik7aWYoMyE9Yyl7dmFyIGE9ZS4kZCgpOyFhLmlzQ2hyb21lJiYhYS5pc0ZpcmVmb3h8fGEuaXNFZGdlfHxlLlBhKCl8fHRoaXMubGEoImNzcF8iK2IpO2UudHJhY2soInN0YXRzX2hkX2NzcCIsYiwhMCl9fS5iaW5kKHRoaXMpLDFFMyl9LFl1OmZ1bmN0aW9uKCl7dGhpcy5iYT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5BYikpOwp0aGlzLnhiKCl9LEFkOmZ1bmN0aW9uKGEpe3RoaXMuRGM9ITA7dGhpcy5iYXx8KHRoaXMuYmE9dGhpcy5xYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIoYSkpLHRoaXMueGIoKSx0aGlzLldkKCkpfSxXdTpmdW5jdGlvbigpe2lmKHRoaXMuUmIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUmIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5SYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZil7fWE/dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMuemgoKX1lbHNlIHRoaXMuemgoKX0seWg6ZnVuY3Rpb24oKXt2YXIgZjt2YXIgYztmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuc2IoKSk7dGhpcy5idihmLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuWWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLkFkKHRoaXMuQmMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX10aGlzLnZiPW51bGwsdGhpcy5ZZSgpfSxidjpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZigpe2UoKSYmYigpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5FYShuZXcgeChhKSxmLGZ1bmN0aW9uKCl7ZSgpJiZjKCl9KX0semg6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLnNiKCkpO3RoaXMuY3YoZiwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnloLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5BZCh0aGlzLkJjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlNiJiZ0aGlzLlNiLmxlbmd0aCl7dmFyIGM9dGhpcy5TYi5zbGljZSgpLGY7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnloKCl9LGN2OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBmKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZSgpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZlKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1mO2wub25lcnJvcj1lO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZSl9Y2F0Y2gobSl7ZigpfX0sWWU6ZnVuY3Rpb24oKXt0aGlzLlFiPyh0aGlzLmFmKyssdGhpcy5FYShuZXcgeCh0aGlzLlFiKSx0aGlzLlZ1LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMud2goKX0sWmU6ZnVuY3Rpb24oYSl7dGhpcy5BZCh0aGlzLnBmLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVnU6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMuYWY/dGhpcy5ZZSgpOnRoaXMuWmUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy53aCgpOnRoaXMuWmUoIkFBQSIpfSx3aDpmdW5jdGlvbigpe3RoaXMuYmE9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLmFiKHRoaXMuQWIpKTt0aGlzLnhiKCk7dGhpcy5XZCgpfSx4YjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5QYSgpJiYoYT0iMSIpfWNhdGNoKGMpe2E9Mn10aGlzLkRjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuYWIodGhpcy5xZikpO3RoaXMuQ2QmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5DZCYmdGhpcy5DZCgpfSxVbzpmdW5jdGlvbigpe2lmKHRoaXMuZWYmJnRoaXMuaHIoKSl7dmFyIGE9dGhpcy5KcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sQmg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9CmEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRWE6ZnVuY3Rpb24oYSxiLGMsZixoLEEpe2E9bmV3IHNiKGEsYixjKTtmJiYoYS5SaD0hMCk7aCYmZS5PcigpJiYoYS5oZz0hMCk7QSYmKGEudmg9ITApO3JldHVybiBhLmxvYWQoKX0sTWY6ZnVuY3Rpb24oKXtlLlBhKCl8fGUuUWEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsLGY9IiI7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGUpe3RoaXMubGEoIm1lZGlhZmlsZV9ub3htbCIpOwpyZXR1cm59aWYoYylpZihhPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9KGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiIpLnJlcGxhY2UoImNoaXAuZGUiLCJjdXJsb2MuY29tIik7dGhpcy5yYygpfHwoYT10aGlzLkdhKGYpLGY9YS5wcm90b2NvbCsiOi8vIithLmhvc3QpO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7aC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtoLm5ldHdvcmtTdGF0ZT09aC5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5sYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2guYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2guc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMubGEoIm1lZGlhZmlsZV9ub21lZGlhIik7CmVsc2UgdGhpcy5sYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGEoIm1lZGlhZmlsZV94bWxyZXF1ZXN0Iil9LmJpbmQodGhpcyksdGhpcyl9LFRvOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImhvbWFkc3RhdGljdmFzdCI7YS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5FYShhLHRoaXMuSnYuYmluZCh0aGlzKSx0aGlzLkl2LmJpbmQodGhpcykpfSxKdjpmdW5jdGlvbihhKXt2YXIgYj1udWxsLGM9bnVsbDt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LAoidGV4dC94bWwiKSksYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1jfHx0aGlzLmhxKCl9LEl2OmZ1bmN0aW9uKCl7fSxocTpmdW5jdGlvbigpe2UuamMoay5ncSk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5sYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sV2Q6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy51Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLnViLmxlbmd0aDthKyspe3ZhciBiPXRoaXMudWJbYV07InJlcXVlc3QiPT1iLnR5cGUmJmUuUWEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKCl7fSxmdW5jdGlvbigpe30sdGhpcyk7aWYoImV2YWwiPT1iLnR5cGUpe3ZhciBjPW5ldyBSO3dpbmRvd1tjLnFjKCldPXRoaXM7ZS5RYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oYSl7aWYoYS5yZXNwb25zZVRleHQpdHJ5e2V2YWwoYS5yZXNwb25zZVRleHQpfWNhdGNoKGIpe319LGZ1bmN0aW9uKCl7fSwKdGhpcyl9fX0saXY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5iZn0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LHNiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGVhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGM9MDtjPGE7YysrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSxUYjpmdW5jdGlvbihhKXtyZXR1cm4iVHJ1ZSI9PWF8fCJ0cnVlIj09YXx8MT09YXx8IjEiPT1hfHwxPT1hfSxrYjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYyxmLGUsaCxrLGwsbT0wO208YS5sZW5ndGg7KWM9YS5jaGFyQ29kZUF0KG0rKyksZj1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLApoPWM+PjIsYz0oYyYzKTw8NHxmPj40LGs9KGYmMTUpPDwyfGU+PjYsbD1lJjYzLGlzTmFOKGYpP2s9bD02NDppc05hTihlKSYmKGw9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChrKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChsKTtyZXR1cm4gYn0sR2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7CmE9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGM9e30sZj0xNDtmLS07KWNbYltmXV09YVtmXXx8IiI7Yy5xdWVyeUtleT17fTtjW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGMucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gY30scWg6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYz0iIixnLGQ7Zm9yKGc9NzswPD1nO2ctLSlkPWE+Pj40KmcmMTUsYys9ZC50b1N0cmluZygxNik7cmV0dXJuIGN9ZnVuY3Rpb24gYyhhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBmLGUsaD1BcnJheSg4MCksCms9MTczMjU4NDE5MyxsPTQwMjMyMzM0MTcsbT0yNTYyMzgzMTAyLHE9MjcxNzMzODc4LHQ9MzI4NTM3NzUyMCxuLHAsdix1LHc7bj1hLmxlbmd0aDt2YXIgeD1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpZT1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx4LnB1c2goZSk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj1hLmNoYXJDb2RlQXQobi0yKTw8MjR8YS5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpmPWEuY2hhckNvZGVBdChuLTMpPDwyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih4LnB1c2goZik7MTQhPXgubGVuZ3RoJTE2Oyl4LnB1c2goMCk7eC5wdXNoKG4+Pj4yOSk7eC5wdXNoKG48PDMmNDI5NDk2NzI5NSk7CmZvcihhPTA7YTx4Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyloW2ZdPXhbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspaFtmXT1jKGhbZi0zXV5oW2YtOF1eaFtmLTE0XV5oW2YtMTZdLDEpO2U9aztuPWw7cD1tO3Y9cTt1PXQ7Zm9yKGY9MDsxOT49ZjtmKyspdz1jKGUsNSkrKG4mcHx+biZ2KSt1K2hbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSxlPXc7Zm9yKGY9MjA7Mzk+PWY7ZisrKXc9YyhlLDUpKyhuXnBedikrdStoW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx1PXYsdj1wLHA9YyhuLDMwKSxuPWUsZT13O2ZvcihmPTQwOzU5Pj1mO2YrKyl3PWMoZSw1KSsobiZwfG4mdnxwJnYpK3UraFtmXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdT12LHY9cCxwPWMobiwzMCksbj1lLGU9dztmb3IoZj02MDs3OT49ZjtmKyspdz1jKGUsNSkrKG5ecF52KSt1K2hbZl0rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9dix2PXAscD1jKG4sMzApLG49ZSwKZT13O2s9aytlJjQyOTQ5NjcyOTU7bD1sK24mNDI5NDk2NzI5NTttPW0rcCY0Mjk0OTY3Mjk1O3E9cSt2JjQyOTQ5NjcyOTU7dD10K3UmNDI5NDk2NzI5NX1yZXR1cm4oYihrKStiKGwpK2IobSkrYihxKStiKHQpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgdGI9Yy5Nanx8dGIsbD1uZXcgdGI7d2luZG93Lml4PWw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnM9dGhpcy5hWzEwXTt0aGlzLlZwPXRoaXMuYVszXTt0aGlzLmFpPXRoaXMuYVszXTt0aGlzLldpPXRoaXMuYVsyXTt0aGlzLkJrPXRoaXMuYVs0XTt0aGlzLlluPXRoaXMuYVsxMF07dGhpcy5Edj10aGlzLmFbMl07dGhpcy5scz10aGlzLmFbOV07dGhpcy5Lbj10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVszXX1jLnR0PWI7Yi5wcm90b3R5cGU9e1FzOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sczp0aGlzLlVwKGEpfSwKVXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5WcDp0aGlzLiRoKGEpfSwkaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYWk6dGhpcy5WaShhKX0sVmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLldpOnRoaXMuQWsoYSl9LEFrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Cazp0aGlzLlhuKGEpfSxYbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW46dGhpcy5DdihhKX0sQ3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkR2OnRoaXMua3MoYSl9LGtzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sczp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB1Yj1jLnR0fHx1YixvZD1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9b2QuUXMoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5iPWE7YS5tLlA/dGhpcy5SYT1hLm0uUCgpOnRoaXMuUmE9IiI7YS5tLnpnJiZhLm0uemcoe3BhdXNlOnRoaXMubmQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5qaC5iaW5kKHRoaXMpLG11dGU6dGhpcy5EZS5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLkJ2LmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmIuV2E7dGhpcy5wbGF5ZXI9dGhpcy5iLm07dGhpcy5EYj10aGlzLk5jPSExO3RoaXMucG89MUUzO3RoaXMuZ2E9bnVsbDt0aGlzLlM9Yjt0aGlzLnRhPXt9O3RoaXMudmlkZW89e307dGhpcy55ZD17fTt0aGlzLkFvPWUuZWEoMTApO3RoaXMuVmU9MDt0aGlzLkxjPSJXZXJidW5nIC0gW3RpbWVdIjtjJiZjLmFkbWVzc2FnZSYmKHRoaXMuTGM9Yy5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGMuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLm0pJiYKdGhpcy5iLm0udiYmKGE9dGhpcy5iLm0udigpKSx0aGlzLkxjPWMuYWRtZXNzYWdlKGEpKSk7YyYmInRydWUiPT1TdHJpbmcoYy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLnluPWMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMueGQ9ITE7dGhpcy5PZz1jJiZjLm1heFdyYXBwZXJEZXB0aD9wYXJzZUludChjLm1heFdyYXBwZXJEZXB0aCk6MTU7dGhpcy5nPXt9O3RoaXMuSmM9ITE7dGhpcy5FaD0tMTt0aGlzLmNvbnRyb2xzPXRoaXMuY2FwdGlvbj10aGlzLkliPSExO3RoaXMuaHA9ZS5lYSgxMCk7dGhpcy5MYj1lLmVhKDEwKTt0aGlzLktiPWUuZWEoMTApO3RoaXMuc2g9ZS5lYSgxMCk7dGhpcy5jb25mPXt9O3RoaXMuaGM9dGhpcy5yYj0hMTt0aGlzLmVlPW51bGw7dGhpcy5GZD10aGlzLnliPXRoaXMub2U9dGhpcy5LZT10aGlzLlhkPXRoaXMuV2M9dGhpcy5YZT10aGlzLldiPXRoaXMuSGQ9dGhpcy5YZz10aGlzLiRjPXRoaXMua3Y9dGhpcy5oYj0KITE7dGhpcy4kYj1bXX1jLkdqPWI7Yi5wcm90b3R5cGU9e25oOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSxBYTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuUmFdJiZ0aGlzLmNvbmZbdGhpcy5SYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLlJhXVthXSk7cmV0dXJuIGJ9LENoOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1lLk1hJiZlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLCIiLCEwKTt0aGlzLlMuRGM/ZS50cmFjaygiYWRjYWxsIiwiMSIpOmUudHJhY2soImFkY2FsbCIsIjAiKTtlLnRyYWNrKCJzdGF0c19oZF9hZF9jYWxsIiwiIiwhMCk7ZS53KGsucG4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0seGU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuaGI9YztpZih0aGlzLlMuYmEpdGhpcy5WZSsrLHRoaXMuUy5VbygpLHRoaXMuUy5xYSYmdGhpcy5TLmlzRW5hYmxlZD8odGhpcy5DaCgpLG5ldyBVKHRoaXMsYSx0aGlzLk9nLAp7Zmlyc3RDYWxsOiEwLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5TLnpjfSkpOmI/KHRoaXMuQ2goKSxuZXcgVSh0aGlzLGEsdGhpcy5PZyx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuUy56Yyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOiEwfSkpOnRoaXMuSmEoKTtlbHNle3ZhciBmPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2YueGUoYSxiLGMpfSw1MCl9fSxJZTpmdW5jdGlvbihhKXt0aGlzLkZkPXRoaXMueWI9dGhpcy4kYz0hMTt0aGlzLmc9YTt0aGlzLkV1KHRoaXMuZyk7dGhpcy5yZyhhKTt0aGlzLiRiPXRoaXMuamcoYSl9LHJnOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLnlkPXRoaXMuVnEoYSkpLHRoaXMucmcoYS5wYXJlbnQpKX0samc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT0KYS5vcmlnaW4pLCFhfHwhYS5wYXJlbnR8fGEucGFyZW50IGluc3RhbmNlb2YgYnx8KGM9dGhpcy5qZyhhLnBhcmVudCkpLGMucHVzaCh0aGlzLkNxKGEpKSk7cmV0dXJuIGN9LENxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGM9W107aWYoYSYmYS5YKXtiPWEuWC5nZXRBdHRyaWJ1dGUoImlkIik7YT1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspYy5wdXNoKGFbZl0uZ2V0QXR0cmlidXRlKCJpZCIpKTsxPT1jLmxlbmd0aCYmKGM9Y1swXSl9cmV0dXJue2FkSUQ6YixjcmVhdGl2ZUlEOmN9fSxWcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGY9W10sZT1bXSxoPSIiO2lmKGEuWCl7Yj1hLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtmPWEuWC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLlguZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLlguZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7CmEuWC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5YLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPTA7azxmLmxlbmd0aDtrKyspZltrXS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWZba10uZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSksZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goaCkpO2ZvcihrPTA7azxiLmxlbmd0aDtrKyspYy5wdXNoKGEuWWEoYltrXSkpfXJldHVybntpbXByZXNzaW9uczpjLGFkSWRzOmUsYWRJZDpofX0scGE6ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPSJzdGF0c19oZF9hZF9lcnJvciI7YSYmKGEuZXJyb3ImJmEuZXJyb3IuZGV0YWlsJiZhLmVycm9yLmRldGFpbC5jb2RlJiYoYj1hLmVycm9yLmRldGFpbC5jb2RlKSxhLlljJiZhLlljLmVycm9yJiZhLlljLmVycm9yLmNvZGUmJihiPWEuWWMuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5BYy5jb2RlOmI9PQpDLkpkLmNvZGU/ZS53KGsuaHcsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTooZS55ZSgpLGI9PUMudGYuY29kZSYmZS53KGsuQXMsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSk7ZS53KGsuZnEsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lbXB0eSI7YnJlYWs7Y2FzZSB3LnJmLmNvZGU6ZS53KGsuS3YsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl92YXN0bG9hZGZhaWxlZCI7YnJlYWs7Y2FzZSB3LnVmLmNvZGU6ZS50cmFjaygid3JhcHBlcmxpbWl0IiwiMTA2Iik7ZS53KGsub3csdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl93cmFwcGVybGltaXQiO2JyZWFrO2Nhc2Ugdy5LZC5jb2RlOmUudyhrLnZ3LHRoaXMuZy5BLHRoaXMuYi5tLnYoKSwKdGhpcy5CKCksdGhpcy5DKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3htbHBhcnNlIjticmVhaztjYXNlIHcuSWQuY29kZTplLncoay5Ccyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLGUudHJhY2soIm5vbWVkaWEiLCIxMDIiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhIix0aGlzLmhjfHwoZS50cmFjaygibm9tZWRpYV9ub2ZsYXNoIiwiMTA1IiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYW5vZmxhc2giKX0ic3RhdHNfaGRfYWRfZXJyb3IiPT1jJiZhLmVycm9yJiZhLmVycm9yLnNhJiYoYys9Il8iK2EuZXJyb3Iuc2EpO2UudHJhY2soYywiIiwhMCk7dGhpcy5FYihhKTt0aGlzLkphKCl9LEViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5JYS5sZW5ndGg7KXRyeXt2YXIgYz1hLklhLnBvcCgpOwp0aGlzLndlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxFdTpmdW5jdGlvbihhKXt0aGlzLlhkPXRoaXMub2U9dGhpcy5LZT0hMTt0aGlzLnRhPXRoaXMuYi5KO3ZhciBiPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGI9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnRhLnpJbmRleD1iO2I9dGhpcy5iLkg7Yi5xeD0iYXV0byI7dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdJiYoYi5zdHlsZS5wb3NpdGlvbj10aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0pO3RoaXMuY29uZlsidmlkZW8uc3R5bGUiXSYmKGIuc3R5bGU9dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdKTtpZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGMgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoYykmJmIuc2V0QXR0cmlidXRlKGMsdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1bY10pOwp0aGlzLnluJiZ0aGlzLnBsYXllci5sYygpJiYoYi52b2x1bWU9dGhpcy5wbGF5ZXIubGMoKS8xMDApO2Zvcig7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Zm9yKGM9MDtjPGEuVC5sZW5ndGg7YysrKWIuY2FuUGxheVR5cGUoYS5UW2NdLnR5cGUpJiZ0aGlzLnVuKGIsYS5UW2NdLnVybCsiIixhLlRbY10udHlwZSk7dGhpcy5BaChiKT8odGhpcy53bihiKSxhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKSx0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpKTp0aGlzLmcuYnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuZ2E9dGhpcy50YS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYiksdGhpcy5DdSgpKTp0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuZy5vcmlnaW4uYmcody5JZCl9LEN1OmZ1bmN0aW9uKCl7dGhpcy5XYj10aGlzLkhkPSExO3RoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLldiPSEwKTtlLlJmKCk7dGhpcy5nJiZ0aGlzLmcub3JpZ2luJiZ0aGlzLmcub3JpZ2luLmxmJiZlLnhuKHRoaXMuZy5vcmlnaW4ubGYpO2UuVGEoInNldFVwVnBhaWQiKTt2YXIgYT10aGlzLmIuSDt0aGlzLmIuSD1CLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkgsCmEpO3RoaXMuYi5ZZygpO3RoaXMuYi53YygpO2ZvcihhPXRoaXMuYi5KO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2EucGFyZW50fHx0aGlzLmIud2MoKTt0aGlzLmdhPXRoaXMudGE9dGhpcy5iLko7dGhpcy5nZigidnBhaWQiKTt0aGlzLldiJiYoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYikuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX211dGVkIiwiY29udGVudCIsITApLGUudyhrLmxkLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpO3RoaXMuTz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5PLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLk8uc2V0QXR0cmlidXRlKCJhbGxvdyIsCiJhdXRvcGxheSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoImRlbGVnYXRlc3RpY2t5dXNlcmFjdGl2YXRpb24iLCJtZWRpYSIpO3RoaXMuTy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTt0aGlzLmIuSi5hcHBlbmRDaGlsZCh0aGlzLk8pO3RoaXMuTy5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLmIubS5oYSYmdGhpcy5iLm0uaGEoKSYmKGE9ITApO3ZhciBiPXRoaXMuZy5YcSgpLGM9dGhpcy5nLkEuT3JpZ2luYWxBZFBhcmFtZXRlcnMsaD17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS53aWR0aCksCmhlaWdodDpwYXJzZUludCh0aGlzLmIuSi5zdHlsZS5oZWlnaHQpfX0sY29udGVudFBsYXllcjp7bXV0ZWQ6YX19O2UubmEodGhpcy5PLCJjb25maWciLGgpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5uYSh0aGlzLk8sImNvbmZpZyIsaCl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwKMTIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubmEodGhpcy5PLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDJFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm5hKHRoaXMuTywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2E9ZS5LbygiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuUyk7dGhpcy5PLnNyYz1hO2UuUmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe3RoaXMuYi5IYighMCk7aWYoYSYmYS5kYXRhJiZhLmRhdGEubmFtZSl7dGhpcy4kYj1hLmRhdGEub3JpZ2luYWxldmVudC5hZElEczsiQWRFcnJvciI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KGEpO2lmKCJBZEltcHJlc3Npb24iPT1hLmRhdGEubmFtZSYmCih0aGlzLlh2KCksdGhpcy5iLkhiKCEwKSwhdGhpcy55Yikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy55Yj17ZWw6dGhpcy5PLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIscGVyY2VudDpjLHN0YXJ0VGltZTohMX07ZS5xZSh0aGlzLnliKX0iQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJih0aGlzLmIuSGIoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9TdGFydCI9PWEuZGF0YS5uYW1lJiYodGhpcy5iLkhiKCEwKSwKdGhpcy5ldygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5jdygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5kdygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmZ3KCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLmJ3KCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk5oKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPWEuZGF0YS5jbGlja1RocnVUYXJnZXQ7aHx8KGg9dGhpcy5nLmZjKTtpZighaClyZXR1cm47dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpO2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iOwphLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9aH1jYXRjaChiKXt3aW5kb3cub3BlbihoLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpfX0uYmluZCh0aGlzKSwyMDApfSJBZFNraXBwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy4kdigpOyJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTsiQWRQYXVzZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFBsYXlpbmciPT1hLmRhdGEubmFtZSYmdGhpcy5adigpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuV2I9ITAsYi5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLldiPSExLGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGUudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsuZGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSksZS53KGsuUWQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9fS5iaW5kKHRoaXMpKTtlLlJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkphKCl9LmJpbmQodGhpcykpO2UuUmQoInZwYWlkZXJyb3MiLGZ1bmN0aW9uKCl7dGhpcy5KYSgpfS5iaW5kKHRoaXMpKTt0aGlzLmIucm4oZnVuY3Rpb24oYSl7ZS5uYSh0aGlzLk8sInJlc2l6ZSIsYSl9LmJpbmQodGhpcykpfSxZdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTGIpO3RoaXMudHJhY2soInBhdXNlIik7CmUudyhrLk9kLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7YS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b247dGhpcy5IZD0hMH0sWnY6ZnVuY3Rpb24oKXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5IZD0hMX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKTtlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSwkdjpmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxYdjpmdW5jdGlvbigpe3RoaXMudHJhY2soImltcHJlc3Npb24iKTtlLlRhKCJpbXByZXNzaW9uIik7ZS53KGsuemYsCnRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGV3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTtlLlRhKCJzdGFydCIpO2UudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LGN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2UuVGEoImZpcnN0UXVhcnRpbGUiKTtlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpfSxkdzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7ZS5UYSgibWlkcG9pbnQiKTtlLncoay5CZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCkpfSxmdzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTtlLlRhKCJ0aGlyZFF1YXJ0aWxlIik7ZS53KGsuRmYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLkRkKCk7ZS5UYSgiY29tcGxldGUiKX0sCk5oOmZ1bmN0aW9uKGEpe2lmKHRoaXMuTyYmdGhpcy5PLnBhcmVudE5vZGUmJnRoaXMuTy5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuVGEoImFkc3RvcHBlZCIpO3ZhciBiPXRoaXMuTy5wYXJlbnROb2RlO3RoaXMuTy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuTyk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO3RoaXMuTz1lLmNhPSExO3RoaXMuSmEoYSl9fSxXdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO2UudHJhY2soInN0YXRzX3ZwX2Vycm9yaGFuZGxlciIsYiwhMCk7ZS5UYSgiZXJyIixiKTtlLncoay5ndyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpOwp0aGlzLk5oKCEwKX0sdW46ZnVuY3Rpb24oYSxiKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTt2YXIgZj1iLGU9dGhpcy5TO2UucWEmJmUuaXNFbmFibGVkJiYhZS5yYygpPyhmPWUuR2EoZiksYj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk6Yj1mO2Muc3JjPWIucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTtjLm9uZXJyb3I9dGhpcy5Qdi5iaW5kKHRoaXMpO2EuYXBwZW5kQ2hpbGQoYyl9LEFoOmZ1bmN0aW9uKGEpe3JldHVybiAwPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aH0sd246ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsCnRoaXMuRGQuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5FZC5iaW5kKHRoaXMpKX0sc2Q6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuTGguYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5oZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuamYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZC5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVkLmJpbmQodGhpcykpfSxMaDpmdW5jdGlvbihhKXt0aGlzLkRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGJ8fHRoaXMuaGYoYSl9LmJpbmQodGhpcyksdGhpcy5wbykpfSxoZjpmdW5jdGlvbihhKXtpZighdGhpcy5OYyYmdGhpcy5BaCh0aGlzLnZpZGVvKSYmCiF0aGlzLnJiJiYhdGhpcy5EYil7dGhpcy5OYz0hMDt0cnl7aWYoIWUuUGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuZy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMucmJ8fCh0aGlzLnJiPSEwLHRoaXMuc2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwiIiwhMCksdGhpcy5TLmFnfHx0aGlzLlMubGEoInZpZGVvLW5vb3AiKSk7dGhpcy5KYSgpO3JldHVybn19Y2F0Y2goYil7ZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvX2ZhaWwiLCIiLCEwKX10aGlzLk92KCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmIud2MoKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuS2YoKTt0aGlzLmIuWWcoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuV2UoKX19LFdlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuV2MpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7CiJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe3RoaXMuZmQ9W107Zm9yKHZhciBiPXRoaXMuYi5KLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLmZkLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGY9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PQphLmRhdGEpe3RoaXMuSGMoKTthPU1hdGgucm91bmQoKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWYpLzFFMyk7dmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2UudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtlLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuSGMoKX1lbHNlIHRoaXMuSGMoKX0sSGM6ZnVuY3Rpb24oYSl7aWYodGhpcy5mZClmb3IodmFyIGI9MDtiPHRoaXMuZmQubGVuZ3RoO2IrKyl0aGlzLmZkW2JdLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtpZigoYj10aGlzLnZpZGVvLnBsYXkoKSkmJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbihiKXt0aGlzLldjfHwoYT8oInN0cmluZyIhPXR5cGVvZiBiJiZiJiZiLm1lc3NhZ2UmJihiPWIubWVzc2FnZSksdGhpcy5KYSgpLGUudHJhY2soInN0YXRzX2hkX3BsYXlQcm9taXNlRmFpbGVkIiwKYiwhMCkpOih0aGlzLkRlKCEwKSx0aGlzLkhjKCEwKSkpfS5iaW5kKHRoaXMpKTtiLnRoZW4oZnVuY3Rpb24oKXt0aGlzLm9lJiZlLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZVJlc29sdmVkQWZ0ZXJJbXByZXNzaW9uIiwiIiwhMCk7dGhpcy5LZT0hMH0uYmluZCh0aGlzKSk7ZWE/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLk1iLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuTWIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIuYmluZCh0aGlzKSkpOkk9ZnVuY3Rpb24oKXt0aGlzLkpjfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5XZSgpKX0uYmluZCh0aGlzKTt0aGlzLmhlKCkub2godGhpcyl9LERkOmZ1bmN0aW9uKCl7dGhpcy5TLmljJiYhdGhpcy5yYiYmZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApO3RoaXMudHJhY2soImNvbXBsZXRlIik7CmUudyhrLmxuLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5KYSgpfSxKYTpmdW5jdGlvbihhKXtpZighdGhpcy5YZClpZih0aGlzLlhkPSEwLHRoaXMuRmR8fChlLncoay5Ecyx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuZy5nYnx8dGhpcy5nLlliKXt0aGlzLlZlKys7dGhpcy5EYj10aGlzLk5jPSExO3RyeXt0aGlzLnNkKHRoaXMudmlkZW8pfWNhdGNoKGIpe310cnl7dGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMudGEucmVtb3ZlQ2hpbGQodGhpcy5nYSl9Y2F0Y2goZil7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy54ZD0hMTt0cnl7dGhpcy5iLkdoKCl9Y2F0Y2goaCl7fXRoaXMuWGU9ITA7dGhpcy5iLmxlKCk7dGhpcy5JYj0hMTt0aGlzLmhlKCkuaWgoKTt0aGlzLmcuZ2ImJnRoaXMuZy5vcmlnaW4uRWUoKTsKdGhpcy5nLlliJiYoYT90aGlzLmcub3JpZ2luLlNnKCk6dGhpcy5ZZCgpKX1lbHNlIHRoaXMuWWQoKX0sUHY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5zZCh0aGlzLnZpZGVvKSx0aGlzLnJlKCk/dGhpcy5waCgpOnRoaXMuRWQoYSkpfSxFZDpmdW5jdGlvbihhKXt0aGlzLkRiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLnJlKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmhjfHx0aGlzLlMuTWYoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuUy5NZigpKTt0aGlzLmcub3JpZ2luLmJnKHcuSWQpfSxqZjpmdW5jdGlvbigpe2lmKHRoaXMua3YpdGhpcy5KYSgpOwplbHNle3RoaXMuSWI9ITA7dGhpcy5iLm0uYmImJiF0aGlzLlhlJiZ0aGlzLmIubS5iYigpJiZlLncoay5VYyx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5ydihhKTtpZighdGhpcy55Yil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGM9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGI9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLnliPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5GZD0hMDtlLncoay5NaCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmIsCnBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UucWUodGhpcy55Yil9Yz0iIjt0aGlzLmcuVWUmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuc2gpKSYmKGM9dGhpcy5nLlVlLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSx0aGlzLnhkfHwodGhpcy54ZD0hMCxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLncoay5EZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuZy5nYj8odGhpcy5EYj10aGlzLk5jPSExLHRoaXMuc2QodGhpcy52aWRlbyksdGhpcy5nYS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLnRhLnJlbW92ZUNoaWxkKHRoaXMuZ2EpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy54ZD0hMSx0aGlzLmIuR2goKSx0aGlzLmcub3JpZ2luLkVlKCkpOgp0aGlzLkphKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZyh0aGlzLmcuZHVyYXRpb24tYSkpKTt0aGlzLkpjPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxwaDpmdW5jdGlvbigpe3RoaXMuaGM9ITA7dGhpcy50YT10aGlzLmIuSjt0aGlzLnRhLmlubmVySFRNTD0iIjt2YXIgYT05OTk5O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy50YS56SW5kZXg9YTthPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9iamVjdCIpO2Euc2V0QXR0cmlidXRlKCJkYXRhIiwiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaG9tYWRqc2ZsYXNoZGlzcGxheS5zd2YiKTthLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsCiIxMDAlIik7YS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCIpO2Euc2V0QXR0cmlidXRlKCJpZCIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJzdHlsZSIsInZpc2liaWxpdHk6IHZpc2libGUiKTthLnNldEF0dHJpYnV0ZSgiRmxhc2hWYXJzIiwiZGF0YT0iK3RoaXMuUXEoKSk7YS5pbm5lckhUTUw9JzxwYXJhbSBuYW1lPSJhbGxvd3NjcmlwdGFjY2VzcyIgdmFsdWU9ImFsd2F5cyI+PHBhcmFtIG5hbWU9ImFsbG93RnVsbFNjcmVlbiIgdmFsdWU9InRydWUiPjxwYXJhbSBuYW1lPSJiZ0NvbG9yIiB2YWx1ZT0iIzAwMDAwMCI+PHBhcmFtIG5hbWU9Im9wYXF1ZSIgdmFsdWU9ImRpcmVjdCI+Jzt0aGlzLmIuSD1hO3ZhciBiPXRoaXMuYi5ILGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06CmMuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjt0aGlzLmdhPXRoaXMudGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLndjKCk7dGhpcy52aWRlbz10aGlzLmdhLmFwcGVuZENoaWxkKGIpO2I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iuc3R5bGUudG9wPSIwcHgiO2Iuc3R5bGUud2lkdGg9dGhpcy50YS5vZmZzZXRXaWR0aCsicHgiO2Iuc3R5bGUuaGVpZ2h0PXRoaXMudGEub2Zmc2V0SGVpZ2h0KyJweCI7Yi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiO2Iub25jbGljaz10aGlzLktoLmJpbmQodGhpcyk7dGhpcy5nYS5hcHBlbmRDaGlsZChiKTt0aGlzLkpoKCk7dGhpcy5nZigpO3RoaXMuZWU9c2V0SW50ZXJ2YWwodGhpcy5Tby5iaW5kKHRoaXMpLDEwMCk7cmV0dXJuIGF9LFFxOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPVtdLGI9e30sYz0wO2M8dGhpcy5nLlQubGVuZ3RoO2MrKyl7dmFyIGY9Yj10aGlzLmcuVFtjXSxlO2U9Yi51cmw7CnZhciBoPXRoaXMuUztoLnFhJiZoLmlzRW5hYmxlZCYmIWgucmMoKSYmKGU9aC5HYShlKSxlPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTtmLnVybD1lO2EucHVzaChiKX1yZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHttZWRpYWZpbGVzOmF9KSl9LFNvOmZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXRoaXMudmlkZW8uZ2V0Rmxhc2hEaXNwbGF5U3RhdHVzKCk7dGhpcy52aWRlby5wYXVzZWQ9YS5wYXVzZWQ7YS50aW1lPj10aGlzLmcuZHVyYXRpb24/KGNsZWFySW50ZXJ2YWwodGhpcy5lZSksdGhpcy5EZCgpKTooMDxhLnRpbWUmJih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lPWEudGltZSx0aGlzLmpmKCkpLCJlcnJvciI9PWEuc3RhdHVzJiYoY2xlYXJJbnRlcnZhbCh0aGlzLmVlKSx0aGlzLkVkKCkpLHRoaXMudmlkZW8ubXV0ZWQ/dGhpcy52aWRlby5tdXRlKCk6dGhpcy52aWRlby51bm11dGUoKSl9Y2F0Y2goYil7fX0sRGg6ZnVuY3Rpb24oKXt0aGlzLlhnfHwodGhpcy5YZz0KITAsdGhpcy4kY3x8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHJ2OmZ1bmN0aW9uKGEpe2E9PXRoaXMuRWh8fHRoaXMucmJ8fCgwPT1hJiYodGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSksdGhpcy5LZXx8KGUudHJhY2soInN0YXRzX2hkX2ltcHJlc3Npb25XaXRoT3V0UmVzb2x2ZWRQcm9taXNlIiwiIiwhMCksdGhpcy5vZT0hMCksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy5EaCgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMuRGgoKX0uYmluZCh0aGlzKSksdGhpcy5oYyYmZS50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9mbGFzaCIsIiIsITApLHRoaXMucmJ8fGUudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLAoiIiwhMCksZS5QYSgpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX21vYmlsZSIsIiIsITApLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksZS53KGsuemYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSxlLncoay5FZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuaGMmJmUudHJhY2soInBsYXllZFdpdGhGbGFzaCIsIjEwMyIpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi80KSYmKHRoaXMuUy5pYyYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuJGM9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLncoay54Zix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuZy5kdXJhdGlvbi8yKSYmKHRoaXMuUy5pYyYmZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLkJmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmcuZHVyYXRpb24vNCkmJih0aGlzLlMuaWMmJmUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5GZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKSxlLncoay5RZCx0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMuRWg9YSl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMucmIpe2lmKCJtdXRlIj09YXx8InVubXV0ZSI9PWF8fCJwYXVzZSI9PWF8fCJyZXN1bWUiPT1hKXtpZih0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl0pcmV0dXJuO3RoaXNbYSsiSGFzQmVlblRyYWNrZWQiXT0hMH12YXIgYz1bXTt0cnl7Yz10aGlzLldxKHRoaXMuZy5JYSxhKX1jYXRjaChmKXtjPQpbXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGg9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMueWQuaW1wcmVzc2lvbnMmJmUuTXIoaC51cmwsdGhpcy55ZC5pbXByZXNzaW9ucyk/dGhpcy53ZShoLnVybCxoLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS53KGsubm4sdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHthZElkOnRoaXMueWQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLndlKGgudXJsLGgudHlwZSl9Y2F0Y2gobCl7fWlmKCFiKXRyeXt0aGlzLmcuSWE9dGhpcy5wcCh0aGlzLmcuSWEsYSl9Y2F0Y2gobSl7fX19LHdlOmZ1bmN0aW9uKGEsYixjLGYpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihhPXRoaXMuUy52YShhKSxjJiZhLnRuKGMpLGZ8fChmPXRoaXMuJGYpLHRoaXMuUy5FYShhLGYsdGhpcy4kZiwKITEsITApKX0sV3E6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxwcDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxPdjpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5LaC5iaW5kKHRoaXMpfSxLaDpmdW5jdGlvbigpe2UudyhrLlNmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLiRjJiZlLlBhKCkmJmUudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIixlLkVxKCksITApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e3ZhciBhPXdpbmRvdy5vcGVuKCIiLHRoaXMuUy5xYT8iX3RvcCI6Il9ibGFuayIpO2EuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9CiI8ZGl2PjwvZGl2PiI7YS5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuZy5mY31jYXRjaChiKXt3aW5kb3cub3Blbih0aGlzLmcuZmMsdGhpcy5TLnFhPyJfdG9wIjoiX2JsYW5rIil9fS5iaW5kKHRoaXMpLDIwMCl9LEpoOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIiwKYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIsYS5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLkxjLnJlcGxhY2UoIlt0aW1lXSIsZS5pZygwKSk7dmFyIGI9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5TLlBjJiYoYj10aGlzLlMuUGMpO2ImJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWMuYmluZCh0aGlzKSwxRTMqYik7dGhpcy5jYXB0aW9uPXRoaXMuZ2EuYXBwZW5kQ2hpbGQoYSl9fSxtYzpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSx1ZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5TLlBjKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0KImJsb2NrIil9LGdmOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmNvbnRyb2xzKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLmlkPXRoaXMuaHA7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Iuc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CnRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksYy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGMuc3R5bGVbImZsb2F0Il09ImxlZnQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLkxiO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hP2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMub3YuYmluZCh0aGlzKSk6Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5udi5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnZkKCk7dGhpcy51ZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLm1jKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuS2I7Zi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9mLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLm12LmJpbmQodGhpcykpOmYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHYuYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy52ZCgpO3RoaXMudWQoKX0uYmluZCh0aGlzKSk7Zi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5tYygpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKdGhpcy5jb25mWyJza2lwLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGguc3R5bGUucG9zaXRpb249ImFic29sdXRlIixoLnN0eWxlLnRvcD0iLTUwcHgiLGguc3R5bGUucmlnaHQ9IjBweCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuc2g7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9aC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtoLmlubmVySFRNTD0iIjtiLmFwcGVuZENoaWxkKGMpO3RoaXMuZy5VZSYmYi5hcHBlbmRDaGlsZChoKTsKYi5hcHBlbmRDaGlsZChmKTtiLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMudmQoKTt0aGlzLnVkKCl9LmJpbmQodGhpcykpO3RoaXMuZ2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMubWMoKX0uYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmdhLmFwcGVuZENoaWxkKGIpOyJ2cGFpZCIhPWEmJnRoaXMuYi5tLmhhJiZ0aGlzLmIubS5oYSgpJiYoZS53KGsuVGYsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLkRlKCkpO3RoaXMubmMoKX19LG5jOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sdmQ6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIn0sbnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTsKdGhpcy5iLkgucGF1c2VkPyh0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS53KGsuT2QsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG92OmZ1bmN0aW9uKCl7dGhpcy5IZD9lLm5hKHRoaXMuTywiY29udHJvbCIsInBsYXkiKTplLm5hKHRoaXMuTywiY29udHJvbCIsInBhdXNlIil9LG5kOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5MYik7dGhpcy5iLkgucGF1c2VkfHwodGhpcy5iLkgucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbix0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUudyhrLk9kLAp0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0samg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkxiKTt0aGlzLmIuSC5wYXVzZWQmJih0aGlzLmIuSC5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLkljLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxsdjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkPyh0aGlzLmIuSC5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSxlLnRyYWNrKCJzdGF0c19oZF91bm11dGVkIiwidXNlciIsITApLGUudyhrLmRmLHRoaXMuZy5BLHRoaXMuYi5tLnYoKSx0aGlzLkIoKSx0aGlzLkMoKSkpOih0aGlzLmIuSC5tdXRlZD0hMCxhLmlubmVySFRNTD0KdGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJ1c2VyIiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LG12OmZ1bmN0aW9uKCl7dGhpcy5XYj9lLm5hKHRoaXMuTywiY29udHJvbCIsInVubXV0ZSIpOmUubmEodGhpcy5PLCJjb250cm9sIiwibXV0ZSIpfSxEZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYi5ILm11dGVkfHwodGhpcy5iLkgubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCksZS53KGsubGQsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJ2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7CnRoaXMuYi5ILm11dGVkJiYodGhpcy5iLkgubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksZS50cmFjaygic3RhdHNfaGRfdW5tdXRlZCIsImNvbnRlbnQiLCEwKSxlLncoay5kZix0aGlzLmcuQSx0aGlzLmIubS52KCksdGhpcy5CKCksdGhpcy5DKCkpKX0sTWI6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5NYik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuTWIpO3RoaXMuV2N8fHRoaXMuSmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLldlKCkpfSxZZDpmdW5jdGlvbigpe3RoaXMuV2M9ITA7dGhpcy5oYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5oYiksdGhpcy5oYj0hMSk7aWYoKCJwcmVyb2xsIj09ZS5NYSYmdGhpcy5KY3x8InBvc3Ryb2xsIj09CmUuTWEpJiZ0aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucG9zdEFkSWZyYW1lVXJsOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiYoYT1hKGUuTWEpKTtpZigic3RyaW5nIj09dHlwZW9mIGEmJmEpe2Zvcih2YXIgYj10aGlzLmIuSjtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5iLndjKCk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5zZXRBdHRyaWJ1dGUoInNyYyIsYSk7Yy5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO2Muc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiYm9yZGVyOiAwIG5vbmU7b3V0bGluZTogbm9uZTsiKTtiLmFwcGVuZENoaWxkKGMpO3ZhciBmPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixmdW5jdGlvbihhKXtpZigiY29udGludWUiPT1hLmRhdGEpe3RoaXMuWmQoKTsKYT1NYXRoLnJvdW5kKCgobmV3IERhdGUpLmdldFRpbWUoKS1mKS8xRTMpO3ZhciBiPSIiOzE8YSYmKGI9Imd0MSIpOzU8YSYmKGI9Imd0NSIpOzEwPGEmJihiPSJndDEwIik7MjA8YSYmKGI9Imd0MjAiKTtlLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2UudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMuWmQoKX1lbHNlIHRoaXMuWmQoKX0sWmQ6ZnVuY3Rpb24oKXt0aGlzLlhlPSEwO3RoaXMuYi5sZSgpO3RoaXMuYi5ndSgpO3RoaXMuSWI9ITE7ZS53KGsuZ3AsdGhpcy5nLkEsdGhpcy5iLm0udigpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmhlKCkuaWgoKX0saGU6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLm0mJihhPXRoaXMuYi5tKTtyZXR1cm4gYX0scmU6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7bmV3IEFjdGl2ZVhPYmplY3QoIlNob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoIikmJgooYT0hMCl9Y2F0Y2goYil7bmF2aWdhdG9yLm1pbWVUeXBlcyYmdm9pZCAwIT1uYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdJiZuYXZpZ2F0b3IubWltZVR5cGVzWyJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCJdLmVuYWJsZWRQbHVnaW4mJihhPSEwKX1yZXR1cm4gYX0sS2Y6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFhKCJtaW5WaXMiKTthJiYoZS5wZSh0aGlzLnZpZGVvLGEpP3RoaXMuamgoKTp0aGlzLm5kKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktmKCl9LmJpbmQodGhpcyksMTAwKSl9LEI6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmcmJihhLmNsaWNrdGhyb3VnaD10aGlzLmcuZmMsYS5kdXJhdGlvbj10aGlzLmcuZHVyYXRpb24sYS5hZFBvZD10aGlzLmcuZ2IsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy4kYiYmCjA8dGhpcy4kYi5sZW5ndGgmJihhLmFkSWRzPXRoaXMuJGIpKTtyZXR1cm4gYX0sQzpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRTZXNzaW9uPXRoaXMuQW8rIi0iK3RoaXMuVmU7cmV0dXJuIGF9LCRmOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUD1jLkdqfHxQO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnF0PXRoaXMuYVsxMF07dGhpcy5YbT10aGlzLmFbNV07dGhpcy5Kcz10aGlzLmFbOV07dGhpcy5Xaj10aGlzLmFbNF07dGhpcy5BbD10aGlzLmFbNV07dGhpcy5udD10aGlzLmFbNF07dGhpcy5sPXRoaXMuYVs5XX1jLlVzPWI7Yi5wcm90b3R5cGU9e3B0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5xdDp0aGlzLldtKGEpfSxXbTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWG06dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkpzOgp0aGlzLlZqKGEpfSxWajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV2o6dGhpcy56bChhKX0semw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFsOnRoaXMubXQoYSl9LG10OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5udDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmw6YX19fSkoYyk7dmFyIHZiPWMuVXN8fHZiLHBkPW5ldyB2YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXBkLnB0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYixjLGQpe3RoaXMub3B0aW9ucz1kfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuT2E9bnVsbDt0aGlzLlk9W107dGhpcy5YPW51bGw7dGhpcy5aYj10aGlzLmFjPSExO3RoaXMubGY9IiI7dGhpcy5rZj0hMTtkJiZkLmVtcHR5P3RoaXMuaHMoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6CnRoaXMubG9hZCgpfXZhciBhPTAsZyxkPVtdO2MueW09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuJGQoKSxiO2I9ZS5HYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeCh0aGlzLnVybCk6bC52YShsLnpkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2lmKHRoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmIWEuaXNFZGdlfHxjKXthPWUuVmYodGhpcy51cmwpO2F8fChhPXRoaXMudXJsKTtpZigwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KGwuemQoYSkpKyImdHlwZT1qcyIsYj1sLnZhKGwuemQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiKTpiPWwudmEobC56ZChhKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIn1sLkVhKGIsdGhpcy5ncy5iaW5kKHRoaXMpLAp0aGlzLmRzLmJpbmQodGhpcykpfSxrZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5PYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuTWEpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09Cnt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5PYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuT2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLk1hfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5NYSl0cnl7dmFyIGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWQubGVuZ3RoJiYoZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJysKZFswXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7ZltiXT1nLmZpcnN0Q2hpbGQ7Yy5wdXNoKGcpfWNhdGNoKGgpe2ZvcihhPVtdLnNsaWNlLmNhbGwoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSksYj0wO2I8YS5sZW5ndGg7YisrKWMucHVzaChhW2JdKX1lbHNlIGYuc3BsaWNlKGIsMSl9KTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LGdzOmZ1bmN0aW9uKGEpe3RoaXMuWXQoYSk7dHJ5e3RoaXMuT2E9YS5yZXNwb25zZVhNTCx0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5wYSh0aGlzLkthKHcuS2QpKX10aGlzLlk9CnRoaXMua2coKTt0aGlzLmFjPXRoaXMuJGUoKTt0aGlzLlpiPXRoaXMueGgoKTt0aGlzLlkubGVuZ3RoP3RoaXMudGMoKTp0aGlzLnBhKHRoaXMuS2Eody5BYyx7ZXJyb3I6dGhpcy5rZj9DLkpkOkMuc2Z9KSl9LGhzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLk9hfHwodGhpcy5PYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnBhKHRoaXMuS2Eody5LZCkpfXRoaXMuWT10aGlzLmtnKCk7dGhpcy5hYz10aGlzLiRlKCk7dGhpcy5aYj10aGlzLnhoKCk7dGhpcy5ZLmxlbmd0aD90aGlzLnRjKCk6dGhpcy5wYSh0aGlzLkthKHcuQWMse2Vycm9yOnRoaXMua2Y/Qy5KZDpDLnNmfSkpfSxkczpmdW5jdGlvbigpe3RoaXMucGEodGhpcy5LYSh3LnJmLHtkZXB0aDphfSkpfSx0YzpmdW5jdGlvbigpe3RoaXMuWD10aGlzLlkuc2hpZnQoKTt0aGlzLlJyKCk/dGhpcy5kdigpPyhhKyssbmV3IGIodGhpcyx0aGlzLnNnKCksZywKe0FkU3lzdGVtOnRoaXMuQnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5wYSh0aGlzLkthKHcudWYpKTooYT0wLHRoaXMuR3YoKSYmdGhpcy5JZSh0aGlzLmlwKCkpKX0sRWU6ZnVuY3Rpb24oKXt0aGlzLmFjPyh0aGlzLmFjPTE8dGhpcy5ZLmxlbmd0aCx0aGlzLlkubGVuZ3RoJiZ0aGlzLnRjKCkpOnRoaXMucGFyZW50LkVlKCl9LFNnOmZ1bmN0aW9uKCl7dGhpcy5aYj8odGhpcy5aYj0xPHRoaXMuWS5sZW5ndGgsdGhpcy5ZLmxlbmd0aCYmdGhpcy50YygpKTp0aGlzLnBhcmVudC5TZygpfSxHdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmF2KCk/dGhpcy4kdSgpPyEwOigtMSE9dGhpcy5rYygpP3RoaXMucGEodGhpcy5LYSh3Lm5mKSk6dGhpcy5wYSh0aGlzLkthKHcuQ2kpKSwhMSk6KHRoaXMucGEodGhpcy5LYSh3LkFjLEMudGYpKSwhMSl9LEllOmZ1bmN0aW9uKGEpe2EuSWE9YS5JYS5jb25jYXQodGhpcy5BZSgpKTthLmdiPWEuZ2I/YS5nYjp0aGlzLmFjO2EuWWI9CmEuWWI/YS5ZYjp0aGlzLlpiO3RoaXMucGFyZW50LkllKGEpfSxpcDpmdW5jdGlvbigpe3ZhciBhPW5ldyB3YjthLmR1cmF0aW9uPXRoaXMua2MoKTthLlQ9dGhpcy5wZygpO2EuZmM9dGhpcy5GcSgpO2Eub3JpZ2luPXRoaXM7YS5BPXRoaXMuQXEoKTthLlVlPXRoaXMuVXEoYS5kdXJhdGlvbik7cmV0dXJuIGF9LHBhOmZ1bmN0aW9uKGIpe3RoaXMuWCYmKGIuSWE9Yi5lcnJvci5jb2RlIT13Lm5mLmNvZGU/Yi5JYS5jb25jYXQodGhpcy5IcSgpKTpiLklhLmNvbmNhdCh0aGlzLk9xKCkpKTt0aGlzLlkubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuRWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5FYiYmdGhpcy5wYXJlbnQuRWIoYiksYT0wLHRoaXMudGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5wYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnBhJiZ0aGlzLnBhcmVudC5wYShiKSxhPTApfSxFYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5FYihhKX0sCmJnOmZ1bmN0aW9uKGEsYil7dGhpcy5wYSh0aGlzLkthKGEsYikpfSxLYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyB4YihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGR2OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sYXY6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnBnKCkubGVuZ3RofSwkdTpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMua2MoKX0sJGU6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlkuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSx4aDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWSYmMjw9dGhpcy5ZLmxlbmd0aCYmIXRoaXMuJGUoKSYmKGE9ITApO3JldHVybiBhfSxZdDpmdW5jdGlvbihhKXt0cnl7ZC5wdXNoKHRoaXMubGY9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7fXRyeXt0aGlzLmtmPQphLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxScjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuc2coKS5sZW5ndGh9LHNnOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2UodGhpcy5YLCJWQVNUQWRUYWdVUkkiKX0sQnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZSh0aGlzLlgsIkFkU3lzdGVtIil9LEFlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSJJbXByZXNzaW9uIFRyYWNraW5nIENsaWNrVHJhY2tpbmcgRXJyb3IgVmlld2FibGUgTm90Vmlld2FibGUgdmlld2FibGVfaW1wcmVzc2lvbiBtZWFzdXJhYmxlX2ltcHJlc3Npb24iLnNwbGl0KCIgIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMuRGcoYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHwKZC50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLllhKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sRGc6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy5EZyhhLnBhcmVudE5vZGUpOiExfSxPcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxIcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQWUoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sRnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ZYSh0aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0scGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLAp0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksT2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFZ3OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLllhKGFbY10pfSk7dHJ5e3ZhciBkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLk9jKS1NYXRoLmFicyg3MDAtYi5PYyl9KSxiPWQuY29uY2F0KGcpfWNhdGNoKGUpe31yZXR1cm4gYn0sQXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlguZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpOwphJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMuZGQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LGtjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMuWWEodGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxVcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5YLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSwKZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5PdShkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LGdlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5ZYShhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0samU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LFlhOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuZGQoYSk6IiJ9LGRkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuamUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgVT1jLnltfHxVO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy53cj10aGlzLmFbMl07dGhpcy5kbD10aGlzLmFbMl07dGhpcy5ybD10aGlzLmFbNF07dGhpcy5LbT10aGlzLmFbNF07dGhpcy5aaD10aGlzLmFbN107dGhpcy51cj10aGlzLmFbMV07dGhpcy5sPXRoaXMuYVs3XX1jLlZtPWI7Yi5wcm90b3R5cGU9e3ZyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy53cjp0aGlzLmNsKGEpfSxjbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZGw6dGhpcy5xbChhKX0scWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJsOnRoaXMuSm0oYSl9LEptOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbTp0aGlzLlloKGEpfSxZaDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuWmg6dGhpcy50cihhKX0sdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnVyOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgeWI9Yy5WbXx8eWIscWQ9bmV3IHliKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLAoidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXFkLnZyKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5kdXJhdGlvbj0wO3RoaXMuSWE9W107dGhpcy5UPVtdO3RoaXMuZmM9IiI7dGhpcy5BPXRoaXMuWWI9dGhpcy5nYj0hMTt0aGlzLm9yaWdpbj1udWxsfWMuRWw9YjtiLnByb3RvdHlwZT17YnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sWHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5ULmxlbmd0aDtiKyspaWYoMDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fAowPD10aGlzLlRbYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5UW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuVFtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLlRbYl07cmV0dXJuIGF9fX0pKGMpO3ZhciB3Yj1jLkVsfHx3YjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bT10aGlzLmFbMTBdO3RoaXMub3A9dGhpcy5hWzVdO3RoaXMuZW89dGhpcy5hWzldO3RoaXMuWWo9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzZdfWMuamw9YjtiLnByb3RvdHlwZT17d206ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy54bTp0aGlzLm5wKGEpfSxucDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMub3A6dGhpcy5jbyhhKX0sCmNvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLlhqKGEpfSxYajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciB6Yj1jLmpsfHx6YixyZD1uZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1yZC53bSg0KTt2YXIgdz17S2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsc2E6IlhNTF9QQVJTRV9FUlJPUiJ9LENpOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixzYToiRFVSQVRJT05fRVJST1IifSxBYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsCnNhOiJFTVBUWV9WQVNUIn0sdWY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsc2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHJmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLApzYToiTE9BRF9FUlJPUiJ9LElkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixzYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEt3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLHNhOiJNRURJQUZJTEVfRVJST1IifSxuZjp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixzYToiRFVNTVlfQUQifX0sQz17c2Y6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixzYToiTk9fQURTIn0sdGY6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLHNhOiJOT19NRURJQUZJTEVTIn0sTXc6e3R5cGU6ImVycm9yIiwKY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLHNhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sSmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsc2E6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZ209dGhpcy5hWzRdO3RoaXMuUnQ9dGhpcy5hWzVdO3RoaXMucXM9dGhpcy5hWzhdO3RoaXMuZHQ9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbNV19Yy5zdj1iO2IucHJvdG90eXBlPXtmbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZ206dGhpcy5RdChhKX0sUXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJ0OnRoaXMucHMoYSl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZHQ6CnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubDphfX19KShjKTt2YXIgQWI9Yy5zdnx8QWIsc2Q9bmV3IEFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9c2QuZm0oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5ZYz1iO3RoaXMuSWE9W107dGhpcy5vcmlnaW49bnVsbH1jLmlqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgeGI9Yy5panx8eGI7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTWk9dGhpcy5hWzEwXTt0aGlzLiRpPXRoaXMuYVsyXTt0aGlzLnBxPXRoaXMuYVs4XTt0aGlzLk1uPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzVdfWMuWnI9YjtiLnByb3RvdHlwZT17TGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5NaTp0aGlzLlppKGEpfSxaaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJGk6dGhpcy5vcShhKX0sb3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBxOnRoaXMuTG4oYSl9LExuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Nbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmw6YX19fSkoYyk7dmFyIEJiPWMuWnJ8fEJiLHRkPW5ldyBCYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXRkLkxpKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMubT1hO3RoaXMuV2E9YS5sZygpO3RoaXMuSj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkouaWQ9ZS5lYSgxMCk7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLAoiIiwhMCksdGhpcy5IPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLlhhPXt9O3RoaXMuSWc9ITE7dGhpcy5vYz1bXX1jLklpPWI7Yi5wcm90b3R5cGU9e1NxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuU3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLktyKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50OwplJiYoYT12b2lkIDAhPT13aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2YmJihoLnBvc2l0aW9uPWYpO3JldHVybiBofSxSdTpmdW5jdGlvbigpe3RoaXMuSWc9ITB9LEdoOmZ1bmN0aW9uKCl7dGhpcy5IPUIucG9wKCk7dGhpcy5IfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSwKdGhpcy5ILmlkPSJhZFhkaXNwbGF5Iix0aGlzLkguc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sWWc6ZnVuY3Rpb24oKXt0aGlzLm0ucGF1c2UoKTtlLncoay5VYyx0aGlzLm0udigpKX0sZ3U6ZnVuY3Rpb24oKXt0aGlzLklnfHwodGhpcy5tLnBsYXkoKSxlLncoay5WYyx0aGlzLm0udigpKSl9LHdjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLm0ucGF1c2UoKTt0aGlzLkouc3R5bGUuekluZGV4PWE7dGhpcy5KLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5KLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5KLnN0eWxlLmJveFNpemluZz10aGlzLldhLnN0eWxlLmJveFNpemluZzt0aGlzLkouc3R5bGUud2lkdGg9dGhpcy5XYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD10aGlzLldhLm9mZnNldEhlaWdodCsKMCsicHgiO3RoaXMuSC5zdHlsZS53aWR0aD10aGlzLldhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkguc3R5bGUuaGVpZ2h0PXRoaXMuV2Eub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuV2EpO3RoaXMubS5OYiYmdGhpcy5tLk5iKCk/dGhpcy5tLmxnKCkuYXBwZW5kQ2hpbGQodGhpcy5KKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSik7d2luZG93LnNldFRpbWVvdXQodGhpcy5IYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLm0uZXhpdEZ1bGxzY3JlZW4oKX0sS3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LEdxOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LEhiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuR3EodGhpcy5XYSk7aWYoYi54IT10aGlzLlhhLnh8fGIueSE9dGhpcy5YYS55fHxiLnBvc2l0aW9uIT10aGlzLlhhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlhhLndpZHRofHxiLmhlaWdodCE9dGhpcy5YYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5YYS53aWR0aCYmMDx0aGlzLlhhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMubGUoKTtyZXR1cm59dGhpcy5YYT1iO3RoaXMubS5OYigpPyh0aGlzLkouc3R5bGUubGVmdD0iMHB4Iix0aGlzLkouc3R5bGUudG9wPSIwcHgiKToodGhpcy5KLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5KLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5KLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5KLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSi5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuSC5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5ILnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLm9jLmxlbmd0aDthKyspdGhpcy5vY1thXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX1lLnRoKHRoaXMuSikmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSGIuYmluZCh0aGlzKSwxMCl9LHJuOmZ1bmN0aW9uKGEpe3RoaXMub2N8fCh0aGlzLm9jPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5vYy5wdXNoKGEpfSxsZTpmdW5jdGlvbigpe3RoaXMuSiYmdGhpcy5KLnBhcmVudE5vZGUmJnRoaXMuSi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkoucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkopO3RoaXMuSCYmdGhpcy5ILnBhdXNlJiZ0aGlzLkgucGF1c2UoKX19fSkoYyk7CmZvcih2YXIgTz1jLklpfHxPLEI9W10sQ2I9MDsxMDA+Q2I7Q2IrKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPWUuZWEoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGVhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVmg9dGhpcy5hWzhdO3RoaXMueXI9dGhpcy5hWzNdO3RoaXMuY2o9dGhpcy5hWzZdO3RoaXMubD10aGlzLmFbN119Yy5maj1iO2IucHJvdG90eXBlPXtVaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhPwp0aGlzLlZoOnRoaXMueHIoYSl9LHhyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55cjp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuY2o6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBEYj1jLmZqfHxEYix1ZD1uZXcgRGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj11ZC5VaCg0KTsoZnVuY3Rpb24oYyl7Yy5ubD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5VKGEpO3RoaXMuVGUoYik7CnRoaXMuWWYoKX0sVGU6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LFlmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5CYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuVihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sYmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0saGQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJgohMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxoYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQmEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBFYj1jLm5sfHxFYjsoZnVuY3Rpb24oYyl7Yy5tbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZmEoKTt0aGlzLkNiPXRoaXMuQ2J8fCExO3RoaXMuQWY9dGhpcy5DZj10aGlzLnlnPXRoaXMucmE9dGhpcy5jZj0hMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19FUlJPUiwKImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5scShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuY2Y9ITA7dGhpcy55ZyYmdGhpcy5RZigpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLm9iO2EmJmEuSWImJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5RYygpO3RoaXMueWc9ITA7dGhpcy5RZigpfS5iaW5kKHRoaXMpKTt0aGlzLkxmKCl9LFFmOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2Ipe3RoaXMuUWMoKTtpZighdGhpcy5jZiYmIXRoaXMuUWMoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlRjKCl9LmJpbmQodGhpcyksCjEwMCksITA7dGhpcy5jZiYmdGhpcy5BZiYmIXRoaXMuQ2YmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSxRYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0scWc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sTGY6ZnVuY3Rpb24oKXtpZih0aGlzLlFjKCkpe3ZhciBiPXRoaXMucWcoImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5DZj0wPGIuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLkFmPWIuUnd9dGhpcy5rYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxmKCl9LmJpbmQodGhpcyksMTAwKX0sWXc6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IubHgoKTohMX0sa2M6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLmtjKCk6LTF9LFBxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LGxxOmZ1bmN0aW9uKGIsYSl7dGhpcy5DYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT10aGlzLkNifHwzMDI9PXRoaXMuQ2I/dGhpcy5yYT0hMDp0aGlzLm8oImFkZXJyb3IiLHRoaXMuQ2IpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9LFRjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT8odGhpcy5zKCksdGhpcy5qYSgpKTpiLmhkKCk/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuUHEoYik/KHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYigpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UYygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgRmI9Yy5tbHx8RmI7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxQcjpmdW5jdGlvbigpe3dpbmRvdy5PTy5JbC5ibi4kbT93aW5kb3cuT08uSWwuYm4uJG0uUHcoZnVuY3Rpb24oKXt9KTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUHIoKX0sMTAwKX0sYzpmdW5jdGlvbigpe3RoaXMuRmE9MTUwMDt2YXIgYj1mYSgpO2lmKGImJmIuX19pbnRlcm5hbCYmCmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuTGEoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IEViKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLksoYyl8fCh0aGlzLk0oYyksKG5ldyBGYihjLHRoaXMuRykpLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgR2I9Yy5vbHx8R2IsSGI9bmV3IEdiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLnBtPXRoaXMuYVsxMF07dGhpcy5sPXRoaXMuYVszXX1jLnNwPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudHE6dGhpcy5vbShhKX0sb206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnBtOnRoaXMuaihhKX0sCmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIEliPWMuc3B8fEliLHZkPW5ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXZkLnNxKDQpOyhmdW5jdGlvbihjKXtjLnRpPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMub2E9ITE7dGhpcy50ZygpfSx0ZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RmlndXJlKCkpO2J8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0VmlkZW9FbGVtZW50KCkpO2ImJiFhJiYoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKYiYmYT8odGhpcy5VKGIpLHRoaXMuVihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0saWE6ZnVuY3Rpb24oKXt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5MJiYoMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTsKdmFyIEpiPWMudGl8fEpiOyhmdW5jdGlvbihjKXtjLnNpPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3dpbmRvdy5Xdz1iO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt2YXIgYj1hLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLnMoImVtcHR5IiksdGhpcy5qYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmphKCk6dGhpcy51KCkpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnMoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmlzUGxheWluZygpPwp0aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBLYj1jLnNpfHxLYjsoZnVuY3Rpb24oYyl7Yy51aT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGdoOmZ1bmN0aW9uKGIpe2I9bmV3IEpiKGIpO2Iub2E/dGhpcy5JKCk6dGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgS2IoYix0aGlzLkcpKS5jKCkpfSxjOmZ1bmN0aW9uKCl7dGhpcy5ucXx8KHRoaXMubnE9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLmdoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5naCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLkkoKX19KX0pKGMpO3ZhciBMYj1jLnVpfHxMYixWPW5ldyBMYihxKTtWLmMoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5oaj10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs4XX1jLmhvPWI7Yi5wcm90b3R5cGU9e2dqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5oajp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmw6YX19fSkoYyk7dmFyIE1iPWMuaG98fE1iLHdkPW5ldyBNYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXdkLmdqKDQpOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpOwp0aGlzLlUoYik7aWYoYil7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5OLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSxOYjpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBXPWMuWWx8fFc7KGZ1bmN0aW9uKGMpe2MuWGw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CnkuSWYoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnMuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LklmKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuT3MoYSl9LmJpbmQodGhpcykpO3kuZ3IoKX0sT3M6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5zKCk7dGhpcy5qYSgpO3JldHVybn19dGhpcy5vKCJhZGVycm9yIixhKTt0aGlzLkQoKX19KX0pKGMpOwp2YXIgWD1jLlhsfHxYOyhmdW5jdGlvbihjKXtjLlpsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTt0aGlzLm1kJiYoYj1lLnFwKGIsdGhpcy5tZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBXKGQpO2lmKCF0aGlzLksoZCkpe3RoaXMuTShkKTt2YXIgZj1uZXcgWChkLHRoaXMuRyk7Zi5jKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD0KYy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLm1kfHwodGhpcy5tZD1bXSksdGhpcy5tZC5wdXNoKGJbYV0pLGQ9bmV3IFcoaCksdGhpcy5LKGQpfHwodGhpcy5NKGQpLGY9bmV3IFgoZCx0aGlzLkcpLGYuYygpKX1jYXRjaChrKXt9fX10aGlzLkkoKX0sSWY6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwodGhpcy5kYVtiXT17fSk7dGhpcy5kYVtiXVthXXx8KHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0sZXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5zY3x8KHRoaXMuc2M9W10pLHRoaXMuc2MucHVzaChiKSx0aGlzLmZ1KCkmJih0aGlzLlFlKCksdGhpcy5jKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYKKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxncjpmdW5jdGlvbigpe2lmKHRoaXMuc2MpZm9yKHZhciBiPTA7Yjx0aGlzLnNjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuc2NbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuZGFbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmV2KGIpfX0pfSkoYyk7CnZhciBOYj1jLlpsfHxOYix5PW5ldyBOYihxKTtkYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkFtPXRoaXMuYVsxMF07dGhpcy4kbj10aGlzLmFbMTBdO3RoaXMudnQ9dGhpcy5hWzddO3RoaXMuRnM9dGhpcy5hWzFdO3RoaXMuVXU9dGhpcy5hWzJdO3RoaXMuQW49dGhpcy5hWzhdO3RoaXMuVnI9dGhpcy5hWzNdO3RoaXMubD10aGlzLmFbMTBdfWMubnc9YjtiLnByb3RvdHlwZT17em06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFtOnRoaXMuWm4oYSl9LFpuOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy4kbjp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMudnQ6dGhpcy5FcyhhKX0sRXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkZzOnRoaXMuVHUoYSl9LFR1OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5VdTp0aGlzLnpuKGEpfSwKem46ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkFuOnRoaXMuVXIoYSl9LFVyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Wcjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9iPWMubnd8fE9iLHhkPW5ldyBPYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXhkLnptKDQpOyhmdW5jdGlvbihjKXtjLm9pPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5VKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuVihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LGJiOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxoYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgUGI9Yy5vaXx8UGI7KGZ1bmN0aW9uKGMpe2MucGk9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPQphLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7YS5pc0FkJiZhLmlzQWQoKT90aGlzLnMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygibm9BZCIsInBsYXllZCIpO3RoaXMuRCghMCl9LmJpbmQodGhpcyksMjUwKTt0aGlzLkR0fHwodGhpcy5EdD0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMuRCgpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpOwphLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgUWI9Yy5waXx8UWI7KGZ1bmN0aW9uKGMpe2Mucmk9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgUGIoZCk7dGhpcy5LKGgpfHwodGhpcy5NKGgpLChuZXcgUWIoaCx0aGlzLkcpKS5jKCkpfWNhdGNoKGspe319dGhpcy5JKCl9LEs6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5IYSlpZihhPT10aGlzLkhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkhhW2IubGIoKV0/ITA6ITF9fSl9KShjKTt2YXIgUmI9Yy5yaXx8UmIsU2I9bmV3IFJiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5LaT10aGlzLmFbOF07dGhpcy5McD10aGlzLmFbNF07dGhpcy5jaT10aGlzLmFbN107dGhpcy5Bdj10aGlzLmFbMl07dGhpcy55dD10aGlzLmFbMTBdO3RoaXMuZG49dGhpcy5hWzZdO3RoaXMubGw9dGhpcy5hWzNdO3RoaXMuQ2o9dGhpcy5hWzEwXTt0aGlzLnlzPXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzEwXX1jLlprPWI7Yi5wcm90b3R5cGU9e0ppOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuS2k6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMuYmkoYSl9LGJpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuY2k6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkF2OnRoaXMueHQoYSl9LHh0OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy55dDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZG46CnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5sbDp0aGlzLkJqKGEpfSxCajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQ2o6dGhpcy54cyhhKX0seHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnlzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubDphfX19KShjKTt2YXIgVGI9Yy5aa3x8VGIseWQ9bmV3IFRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9eWQuSmkoNCk7KGZ1bmN0aW9uKGMpe2MuYWw9cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7CnRoaXMuVShiKTt0aGlzLlYoYSk7dGhpcy5adCh0aGlzLmdldFJhd1BsYXllcigpLGIpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxadDpmdW5jdGlvbihiLGEpe2ImJmIucGF1c2VFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucGF1c2VFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnBhdXNlJiZ0aGlzLmZhLnBhdXNlKCl9LmJpbmQodGhpcykpO2ImJmIucmVzdW1lRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnJlc3VtZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5mYSYmdGhpcy5mYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLnJlc3VtZSYmdGhpcy5mYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEubXV0ZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmZhLm11dGUmJnRoaXMuZmEubXV0ZSgpfS5iaW5kKHRoaXMpKTtiJiZiLnVubXV0ZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZmEmJnRoaXMuZmEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5mYS51bm11dGUmJnRoaXMuZmEudW5tdXRlKCl9LmJpbmQodGhpcykpfSx6ZzpmdW5jdGlvbihiKXt0aGlzLmZhPWJ9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT25seUhPTUFEIn19KX0pKGMpO3ZhciBVYj1jLmFsfHxVYjsoZnVuY3Rpb24oYyl7Yy4kaz11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuUWg9ITF9LGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuUWgmJih0aGlzLkQoKSx0aGlzLlFoPSEwLHRoaXMuZWIoKSk7YS5CYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5EKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFZiPWMuJGt8fFZiOyhmdW5jdGlvbihjKXtjLmJsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0pe2lmKG0ucGxheWVyKXt2YXIgYj1tLnBsYXllcjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goYSl7ZS50cmFjaygib25seUhPTUFEQ29uZkZhaWxlZCIsIiIsITApfWZvcih2YXIgYz0hMSxkPTA7ZDxiLmxlbmd0aDtkKyspYz1uZXcgVWIoYltkXSksdGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgVmIoYyx0aGlzLkcpKS5jKCkpfX1lbHNlIHRoaXMuSSgpfX0pfSkoYyk7dmFyIFdiPWMuYmx8fFdiLFk9bmV3IFdiKHEpO1kuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkh3PXRoaXMuYVs3XTt0aGlzLlFrPXRoaXMuYVsyXTsKdGhpcy5xdT10aGlzLmFbMTBdO3RoaXMuUHA9dGhpcy5hWzRdO3RoaXMubD10aGlzLmFbMV19Yy5Xaz1iO2IucHJvdG90eXBlPXtHdzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHc6dGhpcy5QayhhKX0sUGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFrOnRoaXMucHUoYSl9LHB1OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucXU6dGhpcy5PcChhKX0sT3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlBwOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhiPWMuV2t8fFhiLHpkPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPXpkLkd3KDQpOyhmdW5jdGlvbihjKXtjLkZtPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+CnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuTD8oMCx0aGlzLkwpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmlhKCl9LmJpbmQodGhpcyksNDAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBZYj1jLkZtfHxZYjsoZnVuY3Rpb24oYyl7Yy5FbT11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkpmfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy56cXx8KHRoaXMuQWcoKSx0aGlzLnpxPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLnMoKTp0aGlzLkpmPyh0aGlzLm8oImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMudSgpKToodGhpcy5KZj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLAo1MDApKX0sRHE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EcSgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMucmE9ITAsdGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy51KCksdGhpcy5vKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZygpfS5iaW5kKHRoaXMpLDUwKX0sang6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sdTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBaYj1jLkVtfHxaYjsoZnVuY3Rpb24oYyl7Yy5HbT10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt0aGlzLkZhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IFliKGIuaXRlbShhKSk7dGhpcy5LKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5NKGMpLChuZXcgWmIoYyx0aGlzLkcpKS5jKCkpfXRoaXMuSSgpfX0pfSkoYyk7dmFyICRiPWMuR218fCRiLGFjPW5ldyAkYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Dcj10aGlzLmFbMV07dGhpcy5Hbj10aGlzLmFbNF07dGhpcy5vdT10aGlzLmFbMV07dGhpcy5zaz10aGlzLmFbOF07dGhpcy5OdT0KdGhpcy5hWzNdO3RoaXMuQ249dGhpcy5hWzldO3RoaXMubD10aGlzLmFbMl19Yy5EbD1iO2IucHJvdG90eXBlPXtCcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQ3I6dGhpcy5GbihhKX0sRm46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkduOnRoaXMubnUoYSl9LG51OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5vdTp0aGlzLnJrKGEpfSxyazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuc2s6dGhpcy5NdShhKX0sTXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk51OnRoaXMuQm4oYSl9LEJuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbjp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIGJjPWMuRGx8fGJjLEFkPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPQpBZC5Ccig0KTsoZnVuY3Rpb24oYyl7Yy5uaz1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnNlbmROb3RpZmljYXRpb24oImRvUGxheSIpfSxpYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyKCJwbGF5ZXJQbGF5RW5kIixmdW5jdGlvbigpe3RoaXMuTCYmKDAsdGhpcy5MKSghMCl9LmJpbmQodGhpcykpO2IuYWRkSnNMaXN0ZW5lcigicGxheWxpc3RQbGF5TmV4dCIsZnVuY3Rpb24oKXt0aGlzLkwmJigwLHRoaXMuTCkoITApfS5iaW5kKHRoaXMpKX0sUDpmdW5jdGlvbigpe3JldHVybiJrYWx0dXJhIn19KX0pKGMpOwp2YXIgY2M9Yy5ua3x8Y2M7KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sbG9nOmZ1bmN0aW9uKCl7fSxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkZEpzTGlzdGVuZXI/KGIuYWRkSnNMaXN0ZW5lcigiYWRFcnJvckV2ZW50IixmdW5jdGlvbigpe3RoaXMuT2goKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImZpcnN0UGxheSIsZnVuY3Rpb24oKXt0aGlzLmdnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigicGxheWVyVXBkYXRlUGxheWhlYWQiLGZ1bmN0aW9uKCl7dGhpcy5nZygpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoImFkU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5xbigpfS5iaW5kKHRoaXMpKSx0aGlzLlBoPSExLHRoaXMuaXc9CjFFMyx0aGlzLiRnPXtkb25lOiExfSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmMoKX0uYmluZCh0aGlzKSwxMDApfSxnZzpmdW5jdGlvbigpe3RoaXMuJGcuZG9uZXx8KHRoaXMuJGcuZG9uZT0hMCx0aGlzLlBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PaCgpfS5iaW5kKHRoaXMpLHRoaXMuaXcpKX0scW46ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuUGgpO3RoaXMucygpfSxPaDpmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiwiQWRTdGFydEV2ZW50VGltZW91dCIpLHRoaXMuRCgpKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9W107aWYoYilmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiZiW2NdW2RdJiZiW2NdW2RdLmdldEVycm9yQ29kZSl7dmFyIGU9YltjXVtkXTtiW2NdW2RdLmdldEVycm9yQ29kZSgpOwpiW2NdW2RdLmdldE1lc3NhZ2UoKTtiW2NdW2RdLmdldFR5cGUoKTtiW2NdW2RdLmdldFZhc3RFcnJvckNvZGUoKTthLnB1c2goZS5nZXRFcnJvckNvZGUoKSl9cmV0dXJuIGF9LERhOmZ1bmN0aW9uKCl7dmFyIGI9W107bXcmJm13LmVycm9yRGVsZWdhdGVzP2I9dGhpcy5uZyhtdy5lcnJvckRlbGVnYXRlcyk6dG9wJiZ0b3Aud2luZG93JiZ0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzJiYoYj10aGlzLm5nKHRvcC53aW5kb3cuZXJyb3JEZWxlZ2F0ZXMpKTtmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKylpZigxMDA5PT1iW2FdfHwzMDM9PWJbYV18fDQwMz09YlthXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0pKGMpO3ZhciBkYz1jLm1rfHxkYzsoZnVuY3Rpb24oYyl7Yy5vaz10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpfHwKd2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykpe3ZhciBiPW51bGw7d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyYmMDxlLkxhKHdpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMpJiYoYj13aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKTt3aW5kb3cua1dpZGdldCYmd2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzJiYwPGUuTGEod2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKSYmKGI9d2luZG93LmtXaWRnZXQucmVhZHlXaWRnZXRzKTtpZighYilyZXR1cm47Zm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7YyYmKGM9bmV3IGNjKGMpLHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IGRjKGMsdGhpcy5HKSkuYygpKSl9fXRoaXMuSSgpfX0pfSkoYyk7dmFyIGVjPWMub2t8fGVjLGZjPW5ldyBlYyhxKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub289dGhpcy5hWzldO3RoaXMuUHQ9dGhpcy5hWzVdO3RoaXMubD10aGlzLmFbNV19Yy5KdT1iO2IucHJvdG90eXBlPXtubzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9vOnRoaXMuT3QoYSl9LE90OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5QdDp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmw6YX19fSkoYyk7dmFyIGdjPWMuSnV8fGdjLEJkPW5ldyBnYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUJkLm5vKDQpOyhmdW5jdGlvbihjKXtjLlZsPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTsKdGhpcy5VKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlYoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUDpmdW5jdGlvbigpe3JldHVybiJTaW1wbGVWaWRlb0FuZEltYSJ9fSl9KShjKTt2YXIgaGM9Yy5WbHx8aGM7KGZ1bmN0aW9uKGMpe2MuVWw9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPwoodGhpcy5zKCksdGhpcy5qYSgpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpKToodGhpcy5vKCJhZGVycm9yIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTt0aGlzLmVjKCl9LGVjOmZ1bmN0aW9uKCl7d2luZG93LmltYSYmaW1hLnZpZGVvJiZpbWEudmlkZW8uY2xpZW50P3RoaXMudWUoKSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVlKCkmJih0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCkpfS5iaW5kKHRoaXMpLDUwMCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjKCl9LmJpbmQodGhpcyksMTApfSx1ZTpmdW5jdGlvbigpe3JldHVybiFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhfSx1OmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIGljPWMuVWx8fGljOyhmdW5jdGlvbihjKXtjLldsPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TVUJTSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX0NPTlRFTlQmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfV0VSQlVORyYmMT09ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikubGVuZ3RoJiYhd2luZG93Ll9wbGF5KXt2YXIgYj1uZXcgaGMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSyhiKXx8KHRoaXMuTShiKSwobmV3IGljKGIsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBqYz1jLldsfHxqYyxrYz1uZXcgamMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZvPXRoaXMuYVs1XTt0aGlzLmhpPXRoaXMuYVszXTt0aGlzLkd1PXRoaXMuYVs0XTt0aGlzLnVrPXRoaXMuYVszXTt0aGlzLkZvPXRoaXMuYVs1XTt0aGlzLmltPXRoaXMuYVszXTt0aGlzLlFuPXRoaXMuYVszXTt0aGlzLnF3PXRoaXMuYVs4XTt0aGlzLnJtPXRoaXMuYVs0XTt0aGlzLmRrPXRoaXMuYVs5XTt0aGlzLmw9dGhpcy5hWzddfWMuV3A9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnZvOnRoaXMuZ2koYSl9LGdpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5oaTp0aGlzLkZ1KGEpfSxGdTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR3U6dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnVrOnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Gbzp0aGlzLmhtKGEpfSxobTpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmltOnRoaXMuUG4oYSl9LFBuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Rbjp0aGlzLnB3KGEpfSxwdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnF3OnRoaXMucW0oYSl9LHFtOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ybTp0aGlzLmNrKGEpfSxjazpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGs6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBsYz1jLldwfHxsYyxDZD1uZXcgbGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1DZC51byg0KTsoZnVuY3Rpb24oYyl7Yy5SbD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdOwp0aGlzLlUoYik7dGhpcy5WKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuSmU9ITF9LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkd0KCl9LmJpbmQodGhpcyksNTAwKX0sR3Q6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5MJiZ0aGlzLkwoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuSmUmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuSmUpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxQdTpmdW5jdGlvbigpe3RoaXMuSmU9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUDpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBtYz1jLlJsfHxtYzsoZnVuY3Rpb24oYyl7Yy5RbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuVmI9MH0sYzpmdW5jdGlvbigpe3RoaXMub3M9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5WYnx8KHRoaXMuVmI9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5vKCJhZGVycm9yIik7dGhpcy51KCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwKKHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5vKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLnUoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy51KCkpKToodGhpcy5WYnx8dGhpcy5WYisrLHRoaXMuVmI8PXRoaXMub3M/KHRoaXMuVmIrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm8oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMudSgpKSl9LHU6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLlB1KCksdGhpcy5EKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KCl9LmJpbmQodGhpcyksCjEwMCl9fSl9KShjKTt2YXIgbmM9Yy5RbHx8bmM7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgbWMod2luZG93LnBsYXllckFwaSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLChuZXcgbmMoYix0aGlzLkcpKS5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciBvYz1jLlNsfHxvYyxwYz1uZXcgb2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzhdO3RoaXMubD10aGlzLmFbMTBdfQpjLnlvPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRW46dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBxYz1jLnlvfHxxYyxEZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1EZC5Ebig0KTsoZnVuY3Rpb24oYyl7Yy5ObD1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLlUoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7cmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGlhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuTCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDIwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciByYz1jLk5sfHxyYzsoZnVuY3Rpb24oYyl7Yy5NbD11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuQmEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5lYigpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPSExfS5iaW5kKHRoaXMpKTt0aGlzLmdldFBsYXllcigpO2IuYWRkRXZlbnRMaXN0ZW5lcigicGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLmNwKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRsb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5zKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMucygpfS5iaW5kKHRoaXMpKTtiPXRoaXMuY2QoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLmJzKCk6dGhpcy5lYygpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZigpfHwodGhpcy5vKCJjb250ZW50cGxheSIpLHRoaXMudSghMCkpfS5iaW5kKHRoaXMpLAoxRTMpfSxjcDpmdW5jdGlvbigpe3RoaXMueWYoKXx8dGhpcy51KCEwKX0sYnM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmNkKCk7IWIudWEmJmIuWSYmYi5PdyYmYi5RdyYmKHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLnUoKSl9LGVjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jZCgpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjthOnthPWEuZ2V0RXJyb3IoKTtmb3IoYiBpbiBhKWlmKCJudW1iZXIiPT10eXBlb2YgYVtiXSl7Yj1hW2JdO2JyZWFrIGF9Yj12b2lkIDB9MTAwOT09Ynx8MzAzPT1ifHw0MDM9PWI/KHRoaXMucygpLHRoaXMuamEoKSk6KHRoaXMubygiYWRlcnJvciIsYiksdGhpcy51KCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWMoKX0uYmluZCh0aGlzKSwxMDApfSxjZDpmdW5jdGlvbigpe2lmKCF0aGlzLldnKWZvcih2YXIgYj0KbS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQmEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuV2c9YltjXSk7cmV0dXJuIHRoaXMuV2d9LHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LHU6ZnVuY3Rpb24oYil7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/Yj90aGlzLmNkKCkuYWRzTG9hZGVyP3RoaXMuRCghMCk6dGhpcy5EKCk6dGhpcy5EKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHNjPWMuTWx8fHNjOyhmdW5jdGlvbihjKXtjLk9sPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe2lmKG0mJm0ucGxheWVyYXBpKXt2YXIgYj1tLnBsYXllcmFwaSgpO2lmKGIubGVuZ3RoKXtmb3IodmFyIGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyByYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5LKGMpfHwodGhpcy5NKGMpLChuZXcgc2MoYyx0aGlzLkcpKS5jKCkpfXJldHVybn19dGhpcy5JKCl9fSl9KShjKTt2YXIgdGM9Yy5PbHx8dGMsdWM9bmV3IHRjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFyPXRoaXMuYVsyXTt0aGlzLkFwPXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs1XTt0aGlzLkNvPXRoaXMuYVs0XTt0aGlzLm1wPXRoaXMuYVs5XTt0aGlzLnhpPXRoaXMuYVszXTt0aGlzLmxrPXRoaXMuYVsxXTt0aGlzLlpxPXRoaXMuYVs2XTt0aGlzLkhzPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuTW89YjtiLnByb3RvdHlwZT17cHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT8KdGhpcy5xcjp0aGlzLnpwKGEpfSx6cDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuQXA6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlRyOnRoaXMuQm8oYSl9LEJvOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Dbzp0aGlzLmxwKGEpfSxscDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubXA6dGhpcy53aShhKX0sd2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnhpOnRoaXMua2soYSl9LGtrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sazp0aGlzLllxKGEpfSxZcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWnE6dGhpcy5HcyhhKX0sR3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhzOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubDphfX19KShjKTt2YXIgdmM9Yy5Nb3x8dmMsRWQ9bmV3IHZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwKITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUVkLnByKDQpOyhmdW5jdGlvbihjKXtjLktrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVShiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5WKGEpOnRoaXMubWEoKX1lbHNlIHRoaXMubWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtpZihEKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LApwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sTmI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQmE6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBaPWMuS2t8fFo7KGZ1bmN0aW9uKGMpe2MuSms9dS5leHRlbmQoe2Y6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTGU9CiIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuTGU9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5MZSYmYiE9dGhpcy5MZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKG0uYWRUYWc9YS5hZFVSTCksdGhpcy5vKCJhZGVycm9yIixhLm54KSx0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWIoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT1hJiYodGhpcy5vKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmViKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIGFhPWMuSmt8fGFhOyhmdW5jdGlvbihjKXtjLkxrPQp0LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtEPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRClmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBaKGIpLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBhYShiLHRoaXMuRyksYi5jKCkpfWVsc2UgaWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYj1uZXcgWihiKSxiLm9hP3RoaXMuUWUoKTp0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgYWEoYiwKdGhpcy5HKSxiLmMoKSl9dGhpcy5JKCl9fSl9KShjKTt2YXIgRCx3Yz1jLkxrfHx3Yyx4Yz1uZXcgd2MoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobC51Yi5sZW5ndGgpe3ZhciBhPWwudWIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWUuenUoeyJbTE9BRFNDUklQVF0iOmUuZWEoMTApLCJbVVRJTFNdIjplLmVhKDEwKSwiW0NBTExCQUNLXSI6ZS5lYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWUuTmcuYmluZChlKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1sO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOyllLk5nKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQmk9dGhpcy5hWzEwXTt0aGlzLmw9dGhpcy5hWzJdfWMuaHY9YjtiLnByb3RvdHlwZT17QWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkJpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubDphfX19KShjKTt2YXIgeWM9Yy5odnx8eWMsRmQ9bmV3IHljKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9RmQuQWkoNCk7KGZ1bmN0aW9uKGMpe2MubW09cC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlUoYSk7CnZhciBjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuenM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9ZWxzZSB0aGlzLm1hKCl9LHJ1OmZ1bmN0aW9uKGIpe3RoaXMuTmQ9Yn0saGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MTtyZXR1cm4gYi52aWRlb01vZGVsJiZiLnZpZGVvTW9kZWwuZ2V0JiYoYT1iLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGEpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuenN9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFA6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0saWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMuZmIoYil9LmJpbmQodGhpcykpfSxmYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5MJiZ0aGlzLkwoKSx0aGlzLk5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5OZCYmKG5ldyBIKHRoaXMsdGhpcy5OZCkpLmMoKSl9fSl9KShjKTt2YXIgTj1jLm1tfHxOOyhmdW5jdGlvbihjKXtjLmxtPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsCmEpfSwkYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuZmUpaWYodGhpcy5wYnx8KHRoaXMucGI9MCksdGhpcy5wYisrLDE1PHRoaXMucGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuQnUoKTp0aGlzLnUoITApLCEwO3RoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKTtiLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMudSgpOnRoaXMudSghMCl9ZWxzZSBpZihiPWIudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLmZlPSEwO3ZhciBhPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuWihhKTt0aGlzLkRhKCl8fCh0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyksdGhpcy51KCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy4kYSgpfS5iaW5kKHRoaXMpLDEwKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYT8oYi5XPWEsYi5vKCJhZGVycm9yIixhKSk6Yi5vKCJhZGVycm9yIil9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LGM6ZnVuY3Rpb24oKXt0aGlzLlc9dGhpcy5XfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuJGEoKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheVN0YXRlIixmdW5jdGlvbihhKXsicGxheWluZyI9PQphJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJpc0Fkc1BsYXlpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9ycyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yc1giLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiTk9OX0VWRU5UIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSl9LHU6ZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc/dGhpcy5EKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51KGIpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgSD1jLmxtfHxIOyhmdW5jdGlvbihjKXtjLm5tPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKTt0aGlzLkZhPS0xfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj1uZXcgTih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpO2Iub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiPW5ldyBIKGIsdGhpcy5HKSxiLmMoKSl9aWYod2luZG93LlRWMlBsYXllcnMmJndpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5UVjJQbGF5ZXJzLmxlbmd0aDthKyspYj1uZXcgTih3aW5kb3cuVFYyUGxheWVyc1thXSksYi5vYXx8dGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IEgoYix0aGlzLkcpLGIuYygpKTtlbHNlIGlmKHdpbmRvdy5UVjJQbGF5ZXJzKWZvcihhIGluIHdpbmRvdy5UVjJQbGF5ZXJzKXdpbmRvdy5UVjJQbGF5ZXJzLmhhc093blByb3BlcnR5KGEpJiZ3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYKKGI9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYV0pLGIub2F8fHRoaXMuSyhiKXx8KHRoaXMuTShiKSxiLnJ1KHRoaXMuRyksYj1uZXcgSChiLHRoaXMuRyksYi5jKCkpKTt0aGlzLkkoKX19KX0pKGMpO3ZhciB6Yz1jLm5tfHx6YyxBYz1uZXcgemMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnQ9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbNl19Yy5QbD1iO2IucHJvdG90eXBlPXtldDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZnQ6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBCYz1jLlBsfHxCYyxHZD1uZXcgQmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1HZC5ldCg0KTsoZnVuY3Rpb24oYyl7Yy5Gaz0KcC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuV2Y9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuVihhKTp0aGlzLm1hKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0Use2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV2Z9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGlhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLkw/KDAsdGhpcy5MKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUsCntMbzpmdW5jdGlvbihhKXswPGEmJih0aGlzLldmPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHtMbzpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sUDpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIENjPWMuRmt8fENjOyhmdW5jdGlvbihjKXtjLkVrPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LHJ4OmZ1bmN0aW9uKCl7fSxhdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLm1mKG5ldyBmdW5jdGlvbigpe30pO2EuTHc9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IuYXUoYSk7d2luZG93LlR3PWJ9LGM6ZnVuY3Rpb24oKXt0aGlzLiR0fHwodGhpcy4kdD0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5uZXx8KHRoaXMubmU9MSk7aWYoMjA8dGhpcy5uZSl0aGlzLm8oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy51KCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLk5hKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMubmUrKzt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYygpfS5iaW5kKHRoaXMpLDUwKX19LE5hOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIiwKYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCk7dGhpcy5hYSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbigpe3RoaXMuUGUoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sWjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmYi5vKCJhZGVycm9yIixhKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnhhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO2JyZWFrfX0sUGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJgooYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihhPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yy5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5aKGEpfS5iaW5kKHRoaXMpKTsKYy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5aKGEsITApO3RoaXMuYWEoITApfS5iaW5kKHRoaXMpKX0sRGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYX0seGE6ZnVuY3Rpb24oKXt0aGlzLnJhPSEwfSxhYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRGEoKT8odGhpcy5zKCksdGhpcy5qYSgpKTp0aGlzLnUoYil9LmJpbmQodGhpcyksMTAwKX0sdTpmdW5jdGlvbihiKXt0aGlzLkQoYil9fSl9KShjKTt2YXIgRGM9Yy5Fa3x8RGM7KGZ1bmN0aW9uKGMpe2MuR2s9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7aWYod2luZG93Lm12cCYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKWZvcih2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9Cm5ldyBDYyh7aWQ6YlthXS5pZCxmYWNhZGU6d2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UoKX0pO2Mub2F8fHRoaXMuSyhjKXx8KHRoaXMuTShjKSwobmV3IERjKGMsdGhpcy5HKSkuYygpKX10aGlzLkkoKX19KX0pKGMpO3ZhciBFYz1jLkdrfHxFYyxGYz1uZXcgRWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMudG09dGhpcy5hWzZdO3RoaXMuenc9dGhpcy5hWzddO3RoaXMuaXU9dGhpcy5hWzddO3RoaXMuRnc9dGhpcy5hWzJdO3RoaXMubD10aGlzLmFbMTBdfWMuRHc9YjtiLnByb3RvdHlwZT17c206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMueXcoYSl9LHl3OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy56dzp0aGlzLmh1KGEpfSxodTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaXU6dGhpcy5FdyhhKX0sRXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5Gdzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmw6YX19fSkoYyk7dmFyIEdjPWMuRHd8fEdjLEhkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPUhkLnNtKDQpOyhmdW5jdGlvbihjKXtjLndrPXAuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVShiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlYoYSk7YSYmdGhpcy5VKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBiYT1jLndrfHxiYTsoZnVuY3Rpb24oYyl7Yy52az11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxjOmZ1bmN0aW9uKCl7dGhpcy52Zz0wO3RoaXMuVz10aGlzLld8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5yYT10aGlzLnBjPXRoaXMuJGE9dGhpcy5NYz0hMTt0aGlzLmZoPWUuc2IoMTApO3RoaXMuRmcoKX0sRmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMudWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLk5hKCksITA7dGhpcy52ZysrO2lmKDEwPHRoaXMudmcpdGhpcy5vKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLnUoITApOnRoaXMudSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmcuYmluZCh0aGlzKSwxMDApLCExfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlooYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuWihhLCEwKTt0aGlzLm8oImFkZXJyb3IiLHRoaXMuVyk7dGhpcy5hYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMua2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5hKCl9LmJpbmQodGhpcyksMjApfSxaOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5XPWEsYi5vKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9CmIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy54YSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMueGEoKTticmVha319LERhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmF9LHhhOmZ1bmN0aW9uKCl7dGhpcy5yYT0hMH0sYWE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkRhKCk/KHRoaXMucygpLAp0aGlzLmphKCkpOnRoaXMudShiKX0uYmluZCh0aGlzKSwxMDApfSx1OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkQoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGNhPWMudmt8fGNhOyhmdW5jdGlvbihjKXtjLnhrPXQuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYzpmdW5jdGlvbigpe3ZhciBiPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2ErKyliPW5ldyBiYSh3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5LKGIpfHwodGhpcy5NKGIpLGI9bmV3IGNhKGIsdGhpcy5HKSwKYi5jKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBiYSh3aW5kb3cucGxheWVyKSx0aGlzLksoYil8fCh0aGlzLk0oYiksYj1uZXcgY2EoYix0aGlzLkcpLGIuYygpKSk7dGhpcy5JKCl9fSl9KShjKTt2YXIgSGM9Yy54a3x8SGMsSWM9bmV3IEhjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkF0PXRoaXMuYVs5XTt0aGlzLnhvPXRoaXMuYVs1XTt0aGlzLnRvPXRoaXMuYVsxXTt0aGlzLkpvPXRoaXMuYVs2XTt0aGlzLmJxPXRoaXMuYVs3XTt0aGlzLkhvPXRoaXMuYVs1XTt0aGlzLiRwPXRoaXMuYVsxXTt0aGlzLlptPXRoaXMuYVs1XTt0aGlzLmJrPXRoaXMuYVs3XTt0aGlzLm1vPXRoaXMuYVs4XTt0aGlzLmw9dGhpcy5hWzZdfWMuZm89YjtiLnByb3RvdHlwZT17enQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5BdDp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueG86dGhpcy5zbyhhKX0sc286ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnRvOnRoaXMuSW8oYSl9LElvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Kbzp0aGlzLmFxKGEpfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYnE6dGhpcy5HbyhhKX0sR286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkhvOnRoaXMuWnAoYSl9LFpwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy4kcDp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuWm06dGhpcy5hayhhKX0sYWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmJrOnRoaXMubG8oYSl9LGxvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tbzp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmw6YX19fSkoYyk7dmFyIEpjPWMuZm98fEpjLElkPW5ldyBKYygxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1JZC56dCg0KTsoZnVuY3Rpb24oYyl7Yy5raj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8odGhpcy5VKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuVihiKTp0aGlzLm1hKCkpOnRoaXMubWEoKTp0aGlzLm1hKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxoZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiYKd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sUDpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIEtjPWMua2p8fEtjOyhmdW5jdGlvbihjKXtjLmpqPXUuZXh0ZW5kKHtmOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGM6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7CiRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLm8oImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMudSgpKX0sdGVzdDpmdW5jdGlvbigpe30sdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7Yi5pc1BsYXlpbmcoKT8oYi5wYXVzZSgpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudSgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgTGM9Yy5qanx8TGM7KGZ1bmN0aW9uKGMpe2MubGo9dC5leHRlbmQoe2Y6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxjOmZ1bmN0aW9uKCl7dGhpcy5GYT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYKMDxlLkxhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgS2MoZCksZC5vYXx8dGhpcy5LKGQpfHwodGhpcy5NKGQpLChuZXcgTGMoZCx0aGlzLkcpKS5jKCkpO2Vsc2UgYnJlYWt9dGhpcy5JKCl9fSl9KShjKTt2YXIgTWM9Yy5sanx8TWMsTmM9bmV3IE1jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZxPXRoaXMuYVs3XTt0aGlzLmw9dGhpcy5hWzNdfWMubXM9YjtiLnByb3RvdHlwZT17dXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy52cTp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmw6YX19fSkoYyk7dmFyIE9jPWMubXN8fE9jLEpkPW5ldyBPYygxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1KZC51cSg0KTsoZnVuY3Rpb24oYyl7Yy5xaj1wLmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVShiKSx0aGlzLlYoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5tYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBQYz1jLnFqfHxQYzsoZnVuY3Rpb24oYyl7Yy5waj11LmV4dGVuZCh7ZjpmdW5jdGlvbihiLAphKXt0aGlzLmkoYixhKX0sYzpmdW5jdGlvbigpe3RoaXMuTmYoKX0sTmY6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5mKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBRYz1jLnBqfHxRYzsoZnVuY3Rpb24oYyl7Yy5yaj10LmV4dGVuZCh7ZjpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGM6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgUGMod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIub2Epe3RoaXMuSSgpO3JldHVybn1pZighdGhpcy5LKGIpKXt0aGlzLk0oYik7KG5ldyBRYyhiLHRoaXMuRykpLmMoKTt0aGlzLkkoKTtyZXR1cm59fXRoaXMuSSgpfX0pfSkoYyk7CnZhciBSYz1jLnJqfHxSYyxTYz1uZXcgUmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWo9dGhpcy5hWzNdO3RoaXMuT289dGhpcy5hWzJdO3RoaXMuVWk9dGhpcy5hWzNdO3RoaXMuSXQ9dGhpcy5hWzldO3RoaXMuaWw9dGhpcy5hWzZdO3RoaXMuTnY9dGhpcy5hWzhdO3RoaXMuVGs9dGhpcy5hWzFdO3RoaXMuVW09dGhpcy5hWzRdO3RoaXMuZWk9dGhpcy5hWzddO3RoaXMubD10aGlzLmFbN119Yy5KbD1iO2IucHJvdG90eXBlPXtUajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVWo6dGhpcy5ObyhhKX0sTm86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9vOnRoaXMuVGkoYSl9LFRpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVWk6dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkl0OnRoaXMuaGwoYSl9LGhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PAphP3RoaXMuaWw6dGhpcy5NdihhKX0sTXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk52OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Uazp0aGlzLlRtKGEpfSxUbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVW06dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmVpOnRoaXMuaihhKX0sajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubDphfX19KShjKTt2YXIgVGM9Yy5KbHx8VGMsS2Q9bmV3IFRjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkY9S2QuVGooNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGc9dGhpcy5LZz10aGlzLkpnPSExO3RoaXMub2Q9W107dGhpcy5PZT17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgU2M/bnVsbDpTYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIEljP251bGw6SWMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBOYT9udWxsOk5hLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgSWE/bnVsbDpJYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6VixOaWNrR2FtZUxvYWRlcjoidW5kZWZpbmVkIj09PXR5cGVvZiBiYj9udWxsOmJiLG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2I/bnVsbDpnYixSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgdWM/bnVsbDp1YyxqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB5YT9udWxsOnlhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBBYz9udWxsOkFjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeGM/bnVsbDp4YyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgU2I/bnVsbDpTYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PQp0eXBlb2Yga2M/bnVsbDprYyxtdnA6InVuZGVmaW5lZCI9PT10eXBlb2YgRmM/bnVsbDpGYyxPb3lhbGE6InVuZGVmaW5lZCI9PT10eXBlb2YgSGI/bnVsbDpIYixGT1hORU9QbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTmM/bnVsbDpOYyxSb2NrZXJ5OiJ1bmRlZmluZWQiPT09dHlwZW9mIHBjP251bGw6cGMsaGl0Ym94OiJ1bmRlZmluZWQiPT09dHlwZW9mIGxiP251bGw6bGIsaW5SZWFkOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsS2FsdHVyYToidW5kZWZpbmVkIj09PXR5cGVvZiBmYz9udWxsOmZjLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgYWM/bnVsbDphYyxYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgRGE/bnVsbDpEYSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBYYT9udWxsOlhhLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHRhP251bGw6dGEsVE9ubGluZTJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgU2E/Cm51bGw6U2EsT25seUhPTUFEOiJ1bmRlZmluZWQiPT09dHlwZW9mIFk/bnVsbDpZfX1jLkdsPWI7Yi5wcm90b3R5cGU9e2M6ZnVuY3Rpb24oKXt2YXIgYT1bXSxhPWEubGVuZ3RoP3RoaXMuUnEoYSk6W10sYjt0aGlzLktnPSEwO2lmKGEubGVuZ3RoKXt0aGlzLkpnPSEwO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWI9YVtjXSx0aGlzLmtoKGIpfWVsc2UgZm9yKGMgaW4gdGhpcy5PZSl7aWYodGhpcy5IZylicmVhaztiPXRoaXMuT2VbY107dGhpcy5mZihiKSYmKHRoaXMub2QucHVzaChiKSx0aGlzLmtoKGIpKX19LGZmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgdD8hMDohMX0sUnE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuT2VbY10sdGhpcy5mZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxraDpmdW5jdGlvbihhKXt0aGlzLmZmKGEpJiZhLmMoKX0sClF1OmZ1bmN0aW9uKGEpe2lmKGEmJmEgaW5zdGFuY2VvZiBwJiYhdGhpcy5KZylmb3IodGhpcy5IZz0hMCxhPTA7YTx0aGlzLm9kLmxlbmd0aDthKyspdGhpcy5vZFthXS53YiYmd2luZG93LmNsZWFyVGltZW91dCh0aGlzLm9kW2FdLndiKX19fSkoYyk7dmFyIFVjPWMuR2x8fFVjLEw9bmV3IFVjO0wuYygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmhuPXRoaXMuYVsxXTt0aGlzLmttPXRoaXMuYVs5XTt0aGlzLmJ0PXRoaXMuYVs4XTt0aGlzLmx3PXRoaXMuYVszXTt0aGlzLmw9dGhpcy5hWzRdfWMuYWo9YjtiLnByb3RvdHlwZT17Z246ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5objp0aGlzLmptKGEpfSxqbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua206dGhpcy5hdChhKX0sYXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmJ0OnRoaXMua3coYSl9LAprdzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHc6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBWYz1jLmFqfHxWYyxMZD1uZXcgVmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1MZC5nbig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuamMoay5IdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUuamMoay5DcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgTWQ9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxoYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRz1uZXcgUixtPSExO0cucWMoKTtHLkJnKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5xYygpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcuQmcoKSwKZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7Ry5xYygpO3ZhciBOZD1NZChmdW5jdGlvbigpe2UuZmlyZUV2ZW50KHdpbmRvdyxHLkZyKCkse2lkOk5kfSl9LDUwMCksbGE9ZS5lYSgxMCk7Z2EoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy53cD10aGlzLmFbOF07dGhpcy4kcz10aGlzLmFbMl07dGhpcy55cT10aGlzLmFbNF07dGhpcy5qbz10aGlzLmFbMV07dGhpcy5laj10aGlzLmFbNV07dGhpcy5sPXRoaXMuYVsyXX1jLnZqPWI7Yi5wcm90b3R5cGU9e1JtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5TbTp0aGlzLnZwKGEpfSx2cDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLndwOnRoaXMuWnMoYSl9LFpzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kczp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gMzwKYT90aGlzLnlxOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbzp0aGlzLmRqKGEpfSxkajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZWo6dGhpcy5qKGEpfSxqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5sOmF9fX0pKGMpO3ZhciBXYz1jLnZqfHxXYyxPZD1uZXcgV2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRj1PZC5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYmg9dGhpcy5jb25mPXRoaXMuWmE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLmpkPTA7dGhpcy5SYT0iIjt0aGlzLnBkPVtdO3RoaXMucWQ9MDt0aGlzLmVoPSExO3RoaXMuTWU9W119Yy5TaD1iO2IucHJvdG90eXBlPXt5dTpmdW5jdGlvbihhKXt0aGlzLmJoPWF9LHRkOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5SYT10aGlzLnBsYXllci5QKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHR1OmZ1bmN0aW9uKGEpe3RoaXMuWmE9YX0sc3U6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEFhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5SYV0mJnRoaXMuY29uZlt0aGlzLlJhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuUmFdW2FdKTtyZXR1cm4gYn0sdmM6ZnVuY3Rpb24oYSxiKXtlLnFiKCJ3ZWx0LmRlIikmJmUuUWEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuWmEpOwp2YXIgYz0hMSxmPSExO2lmKHRoaXMuSXIoKSl0aGlzLlphLmYodGhpcy5aYS5lZCx0aGlzLlphLnlhLHRoaXMuWmEuTmUsZnVuY3Rpb24oKXt0aGlzLnZjKGEsYil9LmJpbmQodGhpcyksdGhpcy5aYS5YYyk7ZWxzZSBpZih0aGlzLmlyKCkpdGhpcy5rdShmdW5jdGlvbigpe3RoaXMudmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UudyhrLlVjLHRoaXMucGxheWVyLnYoKSk7dmFyIGg9dGhpcy5jb25mLGw9bmV3IE8odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZsLlJ1KCk7bC5leGl0RnVsbHNjcmVlbigpO1M9bD1uZXcgUChsLHRoaXMuWmEsaCk7bC5uaCh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMubnMoYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PQp0eXBlb2YgdGhpcy5wbGF5ZXIudmUmJihjPXRoaXMucGxheWVyLnZlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLnhlKGEsYyxmKTt0aGlzLnBsYXllci5vaChsKX19LElyOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuamQpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5qZC5nZXRUaW1lKCksdGhpcy5qZD1hLDNFNTxiPyEwOiExO3RoaXMuamQ9YTtyZXR1cm4hMX0sTHU6ZnVuY3Rpb24oKXtlLlNlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5BYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuY2coYSkpP3RoaXMudmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLAplLncoay5WYyx0aGlzLnBsYXllci52KCkpKX0sS3U6ZnVuY3Rpb24oYSl7ZS5TZSgicG9zdHJvbGwiKTtpZighdGhpcy5iaCl7dGhpcy55dSghMCk7dmFyIGI9dGhpcy5jb25mLGM9dGhpcy5BYSgiYWRUYWciKTt0aGlzLkFhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMuQWEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5jZyhjKSk/dGhpcy52YyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGNnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxjdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkR1KHRoaXMuS3UuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuaWEoKX0sCndkOmZ1bmN0aW9uKGEpe2UuU2UoIm1pZHJvbGwiKTtpZighdGhpcy5QZyl7dGhpcy5QZz0hMDt2YXIgYj10aGlzLkFhKCJhZFRhZyIpO3RoaXMuQWEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkFhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy52YyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZz0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5WYyx0aGlzLnBsYXllci52KCkpKX19LGJ1OmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIueHUodGhpcy53ZC5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5CZSgpfSxjOmZ1bmN0aW9uKCl7dGhpcy5MdSgpO3RoaXMucGxheWVyLkJlJiZ0aGlzLmJ1KCk7dGhpcy5jdSgpfSxkdTpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOgphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5wZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuQXcoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLnFkPXRoaXMucGQubGVuZ3RofSxpcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5xZCYmKGE9ITApO3JldHVybiBhfSxrdTpmdW5jdGlvbihhKXt0aGlzLmVoPWE7Zm9yKGE9MDthPHRoaXMucGQubGVuZ3RoO2ErKyl0aGlzLnBkW2FdWyJmdW5jdGlvbiJdKHRoaXMuTHQuYmluZCh0aGlzKSl9LEx0OmZ1bmN0aW9uKGEpe3RoaXMucWQtLTthJiZ0aGlzLk1lLnB1c2goYSk7MD49dGhpcy5xZCYmdGhpcy5laCgpfSxuczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5NZS5sZW5ndGg7YysrKWI9dGhpcy5NZVtjXSwKYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGphPWMuU2h8fGphLFM9ITEscGE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMud3M9dGhpcy5hWzldO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLnRsPXRoaXMuYVsxMF07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5mbj10aGlzLmFbMl07dGhpcy5Waz10aGlzLmFbN107dGhpcy5sPXRoaXMuYVs3XX1jLmtvPWI7Yi5wcm90b3R5cGU9e3ZzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy53czp0aGlzLk1wKGEpfSxNcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTnA6dGhpcy5zbChhKX0sc2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRsOnRoaXMuSG4oYSl9LEhuOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Jbjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmZuOnRoaXMuVWsoYSl9LFVrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Wazp0aGlzLmooYSl9LGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmw6YX19fSkoYyk7dmFyIFhjPWMua298fFhjLFBkPW5ldyBYYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5GPVBkLnZzKDQpfSkuY2FsbChPaGxlaUR1cm9vTm90dXBoLE9obGVpRHVyb29Ob3R1cGgpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.21.26 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
Software
TornadoServer/4.5.3 /
Resource Hash
0b1d74d61a0f7af68241b6ee4c3f15731f4348ea91785d912f292edad42345a9

Request headers

Pragma
no-cache
Origin
https://www.tvtoday.de
Accept-Encoding
gzip, deflate, br
Host
ssl.3.damoh.tvtoday.de
User-Agent
Mozilla/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.tvtoday.de/
Cookie
ioam2018=000d9c0c86673f3c95c8ee5d7:1583022423700:1552868823700:.tvtoday.de:1:1552868823700!apu0yv; _ga=GA1.2.1496432352.1552868824; _gid=GA1.2.1544185460.1552868824; _gat=1; ABTasty=uid%3D19031800270412132%26fst%3D1552868824332%26pst%3Dnull%26cst%3D1552868824332%26ns%3D1%26pvt%3D1%26pvis%3D1%26th%3D; ABTastySession=sen%3D1__referrer%3D__landingPage%3Dhttps%3A//www.tvtoday.de/; __gads=ID=b3456aaefd10f358:T=1552868825:S=ALNI_MY0v4YTmQG8VQ3Lmek04Gokb-XNfQ
Connection
keep-alive
Content-Length
371
Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:06 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.tvtoday.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
112
/
track.adform.net/csimpr/ Frame D567
35 B
423 B
Other
General
Full URL
https://track.adform.net/csimpr/?bn=28999662&csi=qjs_o9YdjfbGgJhdD0XiR_UweMU7oATWlIaBrxGMkiIoXU_mHUSx-ezfLfKLjOYW8-ucfIBIV1BoPZv_sqYk9rBH7RGG-agAtHozSPYLc7c72czNu0qxpw2
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/Standard
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:06 GMT
server
nginx
access-control-allow-origin
https://www.tvtoday.de
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
image/gif
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
expires
-1
30873721.jpg
s1.adform.net/Banners/30873721/ Frame D567
72 KB
72 KB
Image
General
Full URL
https://s1.adform.net/Banners/30873721/30873721.jpg?bv=2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.5.73 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
dde5dcb64204bcf4f0aec18ca0a3b2ab0b6e7195cf6753d21344da3837cba921
Security Headers
Name Value
Strict-Transport-Security max-age=0

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
last-modified
Thu, 28 Feb 2019 09:01:45 GMT
server
nginx
access-control-allow-origin
*
etag
"5c77a379-11f6b"
x-cache-status
HIT
strict-transport-security
max-age=0
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
public, max-age=604800
accept-ranges
bytes
content-type
image/jpeg
content-length
73579
bootstrap.js
s1.adform.net/stoat/615/s1.adform.net/ Frame 10D8
31 KB
0
Script
General
Full URL
https://s1.adform.net/stoat/615/s1.adform.net/bootstrap.js
Requested by
Host: track.adform.net
URL: https://track.adform.net/adfscript/?bn=28999661;rtbwp=2.0;rtbdata=sAP9FHZerDmzsaRTurOjHgtTdqlUltzF5BtwIfiJDjbvNbwdVjYAYfaCOpVma6t3XqInUZd6Omj8eX8d_GOG6_RPhuwD0ITOVSmet1wuRhS1jyt10yFCA4pEsjGOlwJc65oIO3sJpiLPh184sS_bJ6RHO9qy59mNwb8y4cbJGqrvUZfHrXHgE2FwyqMUtzwtUg69Hz5caOR7YVxq5O07ubpYSXCx1r_WjU161wOQ4OGQE5rFF4E7UMpj28Ie8fU18m0Q2bxtWIL1Z9eJkIHLr7B_k6PTZltdLq7ICLInLsC9KJwDPdWax1eUuojBguzFZ2P-Lt-mbKvjC-TW_aZ09JPsdx2lr8S-gah0A5feet8_zoEf-rDa9K3Nimj0-8As0WAW1LOz1C63GTp4t9ZR7Ca3osDQ9G2dw3iI60gHGBc1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.5.73 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
9bf28f6cc36bd0a6e167ff8b916c07b5f23fc702b70ba0bd6d0e67582ebd20fd

Request headers

Response headers

date
Mon, 18 Mar 2019 00:27:05 GMT
content-encoding
gzip
last-modified
Tue, 05 Mar 2019 09:52:41 GMT
server
nginx
status
200
x-cache-status
HIT
vary
Accept-Encoding
content-type
text/javascript
access-control-allow-origin
*
cache-control
public, max-age=100000
expires
Tue, 19 Mar 2019 04:13:28 GMT
/
track.adform.net/adfserve/ Frame 10D8
5 KB
3 KB
Script
General
Full URL
https://track.adform.net/adfserve/?bn=28999661;rtbwp=2.0;rtbdata=sAP9FHZerDmzsaRTurOjHgtTdqlUltzF5BtwIfiJDjbvNbwdVjYAYfaCOpVma6t3XqInUZd6Omj8eX8d_GOG6_RPhuwD0ITOVSmet1wuRhS1jyt10yFCA4pEsjGOlwJc65oIO3sJpiLPh184sS_bJ6RHO9qy59mNwb8y4cbJGqrvUZfHrXHgE2FwyqMUtzwtUg69Hz5caOR7YVxq5O07ubpYSXCx1r_WjU161wOQ4OGQE5rFF4E7UMpj28Ie8fU18m0Q2bxtWIL1Z9eJkIHLr7B_k6PTZltdLq7ICLInLsC9KJwDPdWax1eUuojBguzFZ2P-Lt-mbKvjC-TW_aZ09JPsdx2lr8S-gah0A5feet8_zoEf-rDa9K3Nimj0-8As0WAW1LOz1C63GTp4t9ZR7Ca3osDQ9G2dw3iI60gHGBc1;js=1;adfxid=2x;620;set=en-US|en-US|1600X1200|0|300|250|24|8|3|7|0;fd=0|15&CREFURL=https%3A%2F%2Fwww.tvtoday.de%2F
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/bootstrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
819e38d1705b6a3a165ff3c0337e386f788b4e8aa945288a8663213b088919c4

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:06 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
2311
expires
-1
truncated
/ Frame 10D8
212 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
f5a3fcda09f8e926c6be39da1d076f1f48b7e43750ad11dfb1d847ae8d3b431b

Request headers

Response headers

Content-Type
image/png
Standard
s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/ Frame 10D8
85 KB
0
Script
General
Full URL
https://s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/Standard
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/bootstrap.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.5.73 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
401a531c518c60170d8f34f3328c5709518b8a2f298fb0b337a4b7dacc8034df

Request headers

Response headers

date
Mon, 18 Mar 2019 00:27:06 GMT
content-encoding
gzip
last-modified
Tue, 05 Mar 2019 09:52:41 GMT
server
nginx
status
200
x-cache-status
HIT
vary
Accept-Encoding
content-type
text/javascript
access-control-allow-origin
*
cache-control
public, max-age=100000
expires
Tue, 19 Mar 2019 03:57:39 GMT
/
track.adform.net/csimpr/ Frame 10D8
35 B
423 B
Other
General
Full URL
https://track.adform.net/csimpr/?bn=28999661&csi=HNMThIPmSXNDks4if8I1LZTxUv5EoB5xO-pY2uH2G-0oXU_mHUSx-dvKu1BAT_uG0
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/Standard
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:06 GMT
server
nginx
access-control-allow-origin
https://www.tvtoday.de
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
image/gif
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
expires
-1
30999676.jpg
s1.adform.net/Banners/30999676/ Frame 10D8
61 KB
62 KB
Image
General
Full URL
https://s1.adform.net/Banners/30999676/30999676.jpg?bv=2
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.5.73 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
a53d4fc2cbe26e3ff420b03a578f7a3c7f8e2b828a467c46c7275301b329affa
Security Headers
Name Value
Strict-Transport-Security max-age=0

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:27:06 GMT
last-modified
Tue, 05 Mar 2019 14:18:57 GMT
server
nginx
access-control-allow-origin
*
etag
"5c7e8551-f5a3"
x-cache-status
HIT
strict-transport-security
max-age=0
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
public, max-age=604800
accept-ranges
bytes
content-type
image/jpeg
content-length
62883
info
ad.yieldlab.net/ Frame D567
77 B
947 B
XHR
General
Full URL
https://ad.yieldlab.net/info
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
104.109.68.123 Amsterdam, Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-68-123.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
427db4db07d8392ed795bd9ba409a8233aa312434c293134cadfb4b6e10bf311

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

Response headers

Pragma
no-cache
Date
Mon, 18 Mar 2019 00:27:07 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.tvtoday.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
text/plain
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
94
Expires
Sun, 17 Mar 2019 00:27:07 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 9E3B
42 B
117 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstEDFzUV9vL2tK6hiS5MlngnsaO1dJmXjH5fxjPp6gv4GFKMPdru0qddD-52SYXGoew2_z1oxCpWdzddH2tqEWzf0cfoG7vPvG81Gg&sig=Cg0ArKJSzPIAM4tFX9HaEAE&adk=3503556956&tt=-1&bs=1585%2C1200&mtos=1069,1069,1069,1069,1069&tos=1069,0,0,0,0&p=170,440,260,1168&mcvt=1069&rs=3&ht=0&tfs=396&tls=1465&mc=1&lte=1&bas=0&bac=0&avms=geo&rst=1552868825790&rpt=406&isd=0&msd=0&lm=2&oseid=3&xdi=0&ps=1585%2C6566&ss=1600%2C1200&pt=-1&deb=1-2-3-13-15-18-44-13&tvt=1455&r=v&id=osdim&vs=4&uc=12&upc=0&tgt=DIV&cl=1&cec=10&clc=1&cac=0&cd=728x90&v=20190313
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:816::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
42
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame D567
42 B
117 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuJ2JGQaZtR7SY0xjS_I-Q1EphAAfUnZVCGvS5okTpMUuZRPAwJD899ntjZn9XGiVnbxQz-3ef0tUMEW54r9g0fbrT8TBFzNcwE4rg&sig=Cg0ArKJSzHH0t0xZCoEoEAE&adk=2148447601&tt=-1&bs=1585%2C1200&mtos=1069,1069,1069,1069,1069&tos=1069,0,0,0,0&p=305,1315,905,1475&mcvt=1069&rs=3&ht=0&tfs=396&tls=1465&mc=1&lte=1&bas=0&bac=0&avms=geo&rst=1552868825802&rpt=456&isd=0&msd=0&lm=2&oseid=3&xdi=0&ps=1585%2C6566&ss=1600%2C1200&pt=-1&deb=1-2-3-13-15-18-44-13&tvt=1455&r=v&id=osdim&vs=4&uc=11&upc=0&tgt=DIV&cl=1&cec=29&clc=1&cac=0&cd=0x0&v=20190313
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:816::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,44,43,39",quic=":443"; ma=2592000; v="46,44,43,39"
content-length
42
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
track.adform.net/serving/unload/ Frame D567
35 B
423 B
Other
General
Full URL
https://track.adform.net/serving/unload/?version=15&unload=-8024436743952979671@@28999662,5932243337901827721,100|1004|0|0|0|0|0|0|0||51|0|7|1872caf2-1ce9-43eb-a8ac-a492e85981cb_1|||1|0|0|OlVXXGIWRAaGzPEEW2LBpIqxHfNe4Y0jyUVNdPdwUnMHnpm0frxHbKp8MuJ-GB2Gvg-xzO9SdfY1|||11
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/Standard
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:07 GMT
server
nginx
access-control-allow-origin
https://www.tvtoday.de
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
image/gif
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
expires
-1
/
track.adform.net/Serving/Event/ Frame D567
35 B
257 B
Image
General
Full URL
https://track.adform.net/Serving/Event/?bn=28999662&event=178&time=1&banner=30873721&name=Viewable%20impressions&imprid=5932243337901827721&icid=-8024436743952979671&eData=qjs_o9Ydjfa767YmKayUn2STqJ59aHKoqm1-GLGKnAhAkYsvMN4nNy35duQKHNT7T_nUtN9o408_QmhrfQaHhg2&rnd=449405604&rtbwp=2.0&rtbdata=vzB8uL8iSYCYOuySptf0MlMML11tIWZxlvVdYMMTe3EIH3ODpUbFIAe9vlaKmsguXqInUZd6Omj8eX8d_GOG6_RPhuwD0ITOVSmet1wuRhS1jyt10yFCA4pEsjGOlwJc65oIO3sJpiLPh184sS_bJ6RHO9qy59mNwb8y4cbJGqqrwYdhe-1wFGFwyqMUtzwtGBN47w9GBI57YVxq5O07ubpYSXCx1r_WjU161wOQ4OGQE5rFF4E7UMpj28Ie8fU18m0Q2bxtWIL1Z9eJkIHLr7B_k6PTZltdLq7ICLInLsC9KJwDPdWax1eUuojBguzFZ2P-Lt-mbKvjC-TW_aZ09JPsdx2lr8S-gah0A5feet8_zoEf-rDa9K3Nimj0-8As0WAW1LOz1C63GTp4t9ZR7Ca3osDQ9G2dw3iI60gHGBc1
Requested by
Host: www.tvtoday.de
URL: https://www.tvtoday.de/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015

Request headers

Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (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, 18 Mar 2019 00:27:07 GMT
server
nginx
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
image/gif
expires
-1
5c63db338189653649847e56_245.jpg
images.tvtoday.de/itv/2019-03-18/
10 KB
10 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/5c63db338189653649847e56_245.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
665bb776a8d5f2ffa819a20db94a9eb1e76082c28b687819a69c4ec1c82a2a03

Request headers

:path
/itv/2019-03-18/5c63db338189653649847e56_245.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:19:59 GMT
last-modified
Sat, 09 Mar 2019 03:23:27 GMT
age
428
etag
"26a8-583a0dce9d892"
vary
X-Forwarded-Proto
x-varnish
1020834369 1021302258
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
591c6cd0f033af5b5810b9b2_245.jpg
images.tvtoday.de/itv/2019-03-18/
9 KB
9 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/591c6cd0f033af5b5810b9b2_245.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
6b3c93443bcda766e5f470c2eaa7dc961ef4dbe7f0c5acd908785c85f486d889

Request headers

:path
/itv/2019-03-18/591c6cd0f033af5b5810b9b2_245.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:19:59 GMT
last-modified
Tue, 05 Mar 2019 04:03:43 GMT
age
428
etag
"224f-58350f58da65a"
vary
X-Forwarded-Proto
x-varnish
1020834370 1021651780
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
5c612dd28189653649810a40_245.jpg
images.tvtoday.de/itv/2019-03-17/
9 KB
9 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/5c612dd28189653649810a40_245.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
ffef71ef8678b044460c4f4b88c767cf04c918aca6ed3e7fe1f922fd5498a64e

Request headers

:path
/itv/2019-03-17/5c612dd28189653649810a40_245.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:12:16 GMT
last-modified
Mon, 04 Mar 2019 03:46:07 GMT
age
891
etag
"243d-5833c98bc7b18"
vary
X-Forwarded-Proto
x-varnish
387424210 386647023
status
200
cache-control
max-age=1209600, public
accept-ranges
bytes
content-type
image/jpeg
57d66777f033af5c8b3cc0a1_245.jpg
images.tvtoday.de/itv/2019-03-17/
8 KB
8 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/57d66777f033af5c8b3cc0a1_245.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
eb971385a90d4c4e88fc675ba6e407d4f496f9f9dcb149b79af5c69c08a43ef5

Request headers

:path
/itv/2019-03-17/57d66777f033af5c8b3cc0a1_245.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:08:32 GMT
last-modified
Mon, 04 Mar 2019 03:47:01 GMT
age
1116
etag
"2052-5833c9bf791e1"
vary
X-Forwarded-Proto
x-varnish
387424213 386866125
status
200
cache-control
max-age=1209600, public
accept-ranges
bytes
content-type
image/jpeg
5c6180da8189653649817c87_245.jpg
images.tvtoday.de/itv/2019-03-17/
11 KB
11 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/5c6180da8189653649817c87_245.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
90572652134ef7ebcc6f1db54ede6867e6d7bb6e39ee3c0a1d55504209f281cc

Request headers

:path
/itv/2019-03-17/5c6180da8189653649817c87_245.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:04:12 GMT
last-modified
Mon, 04 Mar 2019 03:46:20 GMT
age
1376
etag
"2ad4-5833c99823bc4"
vary
X-Forwarded-Proto
x-varnish
1020707890 1021454281
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
5c5aaca581896536497a0a71_245.jpg
images.tvtoday.de/itv/2019-03-17/
7 KB
7 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-17/5c5aaca581896536497a0a71_245.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a748da8e7e10ebee81953c33d0ae614cb1fddbecee249c5ed9a8d8c7713c438f

Request headers

:path
/itv/2019-03-17/5c5aaca581896536497a0a71_245.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:04:12 GMT
last-modified
Mon, 04 Mar 2019 03:49:28 GMT
age
1376
etag
"1b70-5833ca4bd058f"
vary
X-Forwarded-Proto
x-varnish
1021002697 1017659764
status
200
cache-control
max-age=1209600, public
accept-ranges
bytes
content-type
image/jpeg
5c63dd7c8189653649847e7a_245.jpg
images.tvtoday.de/itv/2019-03-18/
12 KB
13 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/5c63dd7c8189653649847e7a_245.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
20cfc11806c999249ef96695c308fd11909d29f2a15ffcdf9029418e48e5ea9a

Request headers

:path
/itv/2019-03-18/5c63dd7c8189653649847e7a_245.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:19:59 GMT
last-modified
Sat, 09 Mar 2019 03:24:02 GMT
age
428
etag
"3181-583a0def9c18c"
vary
X-Forwarded-Proto
x-varnish
1021689858 1020997959
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
591c6cd0f033af5b5810b9b2_780.jpg
images.tvtoday.de/itv/2019-03-18/
36 KB
36 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/591c6cd0f033af5b5810b9b2_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
5e5d1645c20cafb581df0db6f9c4c0e598f135ccd79179355386f6f13d63a7b9

Request headers

:path
/itv/2019-03-18/591c6cd0f033af5b5810b9b2_780.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:09:01 GMT
last-modified
Tue, 05 Mar 2019 04:03:44 GMT
age
1087
etag
"8e29-58350f5910a8d"
vary
X-Forwarded-Proto
x-varnish
1021366210 1021708523
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
5b88fa3a8189652d08f3060f_780.jpg
images.tvtoday.de/itv/2019-03-18/
36 KB
36 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/5b88fa3a8189652d08f3060f_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
1871b817beac6e0b21e74a9f2805db9a7dc028d78f8e8bc9bc70a5172a537f9d

Request headers

:path
/itv/2019-03-18/5b88fa3a8189652d08f3060f_780.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:12:28 GMT
last-modified
Tue, 12 Mar 2019 03:16:03 GMT
age
880
etag
"8f2b-583dd1bebf692"
vary
X-Forwarded-Proto
x-varnish
387328418 386482583
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
5c6192788189653649818ca6_780.jpg
images.tvtoday.de/itv/2019-03-18/
83 KB
84 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/5c6192788189653649818ca6_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
572f227bbf51f2208700c3ec30ede998397c41025df48e7f349401340e518a65

Request headers

:path
/itv/2019-03-18/5c6192788189653649818ca6_780.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:07:30 GMT
last-modified
Tue, 05 Mar 2019 03:52:25 GMT
age
1178
etag
"14c94-58350cd17f122"
vary
X-Forwarded-Proto
x-varnish
386812622 386607228
status
200
cache-control
max-age=1209600, public
accept-ranges
bytes
content-type
image/jpeg
54c29770e4b08bb8dcab2cbd_780.jpg
images.tvtoday.de/itv/2019-03-18/
57 KB
58 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/54c29770e4b08bb8dcab2cbd_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
a6322e263a6b71efdee765655e76099d0949ed19e0d6c239e18f37891d076293

Request headers

:path
/itv/2019-03-18/54c29770e4b08bb8dcab2cbd_780.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:09:02 GMT
last-modified
Tue, 05 Mar 2019 03:55:35 GMT
age
1086
etag
"e3f7-58350d86d9d30"
vary
X-Forwarded-Proto
x-varnish
1020834371 1021041194
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
5c63dd7c8189653649847e7a_780.jpg
images.tvtoday.de/itv/2019-03-18/
62 KB
63 KB
Image
General
Full URL
https://images.tvtoday.de/itv/2019-03-18/5c63dd7c8189653649847e7a_780.jpg
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
151.106.72.75 Milwaukee, United States, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
Software
/
Resource Hash
e5addc1019bb2afe99fe7a9786a1f201577d1bf2916dc40856008c9bf2700980

Request headers

:path
/itv/2019-03-18/5c63dd7c8189653649847e7a_780.jpg
pragma
no-cache
accept-encoding
gzip, deflate, br
user-agent
Mozilla/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
images.tvtoday.de
referer
https://www.tvtoday.de/
:scheme
https
:method
GET
Referer
https://www.tvtoday.de/
User-Agent
Mozilla/5.0 (Macintosh; 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, 18 Mar 2019 00:09:03 GMT
last-modified
Sat, 09 Mar 2019 03:24:02 GMT
age
1085
etag
"f80d-583a0defdad74"
vary
X-Forwarded-Proto
x-varnish
1021002714 1021421364
status
200
cache-control
public, max-age=1209600
accept-ranges
bytes
content-type
image/jpeg
/
track.adform.net/serving/unload/ Frame D567
35 B
423 B
Other
General
Full URL
https://track.adform.net/serving/unload/?version=15&unload=-8024436743952979671@@28999662,5932243337901827721,100|4799|0|0|0|0|0|0|0||242|0|7|1872caf2-1ce9-43eb-a8ac-a492e85981cb_1|||1|0|0|OlVXXGIWRAaGzPEEW2LBpIqxHfNe4Y0jyUVNdPdwUnMHnpm0frxHbKp8MuJ-GB2Gvg-xzO9SdfY1|||01
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/Standard
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:11 GMT
server
nginx
access-control-allow-origin
https://www.tvtoday.de
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
image/gif
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
expires
-1
/
track.adform.net/serving/unload/ Frame 10D8
35 B
423 B
Other
General
Full URL
https://track.adform.net/serving/unload/?version=15&unload=-8024436743952979671@@28999661,841278106374042755,23|0|0|0|0|0|0|0|0||0|0|7|398834f1-f70e-45f3-8f86-9c8dd732d36e_1|||1|0|0|q2aLqkhdfO41|||11
Requested by
Host: s1.adform.net
URL: https://s1.adform.net/stoat/615/s1.adform.net/load/v/0.0.168/e/.wSBgkg/i/8IG-xAAAABAAA/r:AdConstructor:contents/ImageTag:types/Standard
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.4.25 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015

Request headers

Referer
https://www.tvtoday.de/
Origin
https://www.tvtoday.de
User-Agent
Mozilla/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, 18 Mar 2019 00:27:11 GMT
server
nginx
access-control-allow-origin
https://www.tvtoday.de
access-control-max-age
86400
access-control-allow-methods
GET, POST
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
access-control-allow-credentials
true
content-type
image/gif
access-control-allow-headers
Content-Type, Cache-Control, Accept-Encoding, X-Requested-With
expires
-1

Verdicts & Comments Add Verdict or Comment

190 JavaScript Global Variables

These are the non-standard "global" variables defined on the window object. These can be helpful in identifying possible client-side frameworks and code.

object| onselectstart object| onselectionchange function| queueMicrotask object| lazySizesConfig function| getParameterByName boolean| mobileRedirect object| mobileParam object| html5 object| Modernizr number| horAdCounter number| verAdCounter number| oopAdCounter string| adHomadUnit object| _aeq function| __cmp string| kameleoonURL number| kameleoonStartLoadTime number| kameleoonLoadingTimeout function| kameleoonProcessMessageEvent object| kameleoonS string| kameleoonCc object| kameleoonStn object| iframeNode function| kameleoonDisplayPage number| kameleoonDisplayPageTimeOut function| reloadGAStats string| GoogleAnalyticsObject function| ga function| RLLYdd function| UABPreloaded object| rlllyCln boolean| rlllylsn object| rlllya8bFlags string| rllly8a4Rnd boolean| rlllynpm object| rlllyd388tc object| el1 object| el2 boolean| TftAdEngineBlocked function| adEngineCheck object| dataLayer string| szmvars object| iom object| iam_data object| iam_data_video object| iam_data_text function| reloadIam function| reloadIamVideo function| reloadIamText 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 object| google_tag_data object| gaplugins object| gaGlobal object| gaData object| google_tag_manager function| tfmvideopkg_getUrlParam boolean| tfmvideodebug boolean| tfmplayerdebug object| tfmvideopkg_internal_script_config boolean| playerAsync undefined| param string| imaURL object| imaScript object| head function| tfmsuite function| VideoPlayerQueue function| $ function| jQuery function| whenDefined object| google function| addEventHandler object| TFM object| apntag object| googletag boolean| kameleoonExternalIFrameLoaded object| Kameleoon object| jstz object| bowser object| runtime object| closure_memoize_cache_ object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| _abtasty boolean| ABTastyInstanciated object| ABTasty function| relaunchABTasty function| ABTastyUrlMatchingCondition function| ABTastyPageView object| abtasty function| ABTastyClickTracking function| ABTastyEvent function| ABTastyStartTest function| mb function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima object| _google undefined| _oldVPQueue object| _vpq object| GPT_jstiming undefined| google_measure_js_timing function| adDetection function| require function| requirejs function| define boolean| rllly429sdl boolean| rllly429sdln string| rlllyd388genat string| rlllyd388sthash boolean| rllly708forceimp boolean| rllly242newinject boolean| rllly7edBody boolean| rlllyf5eDetect object| rlllydb1Mobile object| rlllyd3881 object| rlllyd388o1 object| rlllyd388o2 object| rlllyd388o3 object| rlllyd3882 number| rlllyd388d3 object| rlllyd3884 object| rlllyd3885 boolean| rllly63cij object| _oldQueue object| apstag object| _deq string| sidebar_target string| adsc_adunit1 string| adsc_adunit2 string| adsc_layout function| generateInfolayer object| permutive function| calculateDay object| exportz undefined| _ object| lazySizes boolean| adEngineVideoURLReady object| criteo_pubtag object| Criteo undefined| Backbone object| _EQLService object| _EQPScript object| __emqSegments boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id number| google_unique_id object| google_reactive_ads_global_state boolean| rllly827Track function| Goog_AdSense_getAdAdapterInstance function| Goog_AdSense_OsdAdapter object| _EQPService object| _emqYL object| _emqConImpact string| ada_publisher object| _adrtx object| _emqAdexGif string| _emqstr object| OhleiDurooNotuph boolean| F object| Xw object| ix function| videopkgInterface object| __google_ad_urls boolean| google_osd_loaded boolean| google_onload_fired function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb string| hic_qos boolean| __adform_onload object| Adform function| ADFReload function| ADFCall function| ADFcall

0 Cookies

9 Console Messages

Source Level URL
Text
console-api log URL: https://www.tvtoday.de/(Line 37)
Message:
mobileAlternate: https://m.tvtoday.de/
console-api log URL: https://www.tvtoday.de/(Line 214)
Message:
GA LOAD:
console-api log URL: https://www.tvtoday.de/(Line 259)
Message:
TftAdEngineBlocked:: false
console-api log URL: https://www.tvtoday.de/(Line 302)
Message:
IAM: {"st":"tvspielf","cp":"D/T/R/H/W/-/-/Thema_Entertainment_tvtoday","sv":"ke","sc":"yes"}
console-api info URL: https://acdn.adnxs.com/ast/ast.js(Line 1)
Message:
AST library loaded: 0.21.1
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 83)
Message:
RW: init sliders
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 83)
Message:
RW: init sliders
console-api log URL: https://www.tvtoday.de/app/js/main.js(Line 82)
Message:
homead ready
console-api log URL: https://www.tvtoday.de/(Line 6444)
Message:
AdBlockerNotDetected

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.

a.bf-ad.net
a.bf-tools.net
a.twiago.com
a.volvelle.tech
a2.tvspielfilm.de
aax.amazon-adsystem.com
acdn.adnxs.com
ad.ad-srv.net
ad.yieldlab.net
ad.zanox.com
ad18.ad-srv.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ariane.abtasty.com
beacon.krxd.net
bidder.criteo.com
c.amazon-adsystem.com
c1.adform.net
cdn.adrtx.net
cdn.emetriq.de
cdn.permutive.com
cm.g.doubleclick.net
counts.yieldlab.net
d.df-srv.de
dcinfos.abtasty.com
de.ioam.de
dmp.theadex.com
dsp.adfarm1.adition.com
eacgkwdpqg.kameleoon.eu
emq.bf-tools.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
id5-sync.com
images.tvtoday.de
match.adsrvr.org
p.rfihub.com
p.yieldlab.net
pagead2.googlesyndication.com
pb.media01.eu
s0.2mdn.net
s1.adform.net
s3.amazonaws.com
script.ioam.de
secure.adnxs.com
securepubads.g.doubleclick.net
ssl.1.damoh.tvtoday.de
ssl.2.damoh.tvtoday.de
ssl.3.damoh.tvtoday.de
static.criteo.net
stats.g.doubleclick.net
sync.mathtag.com
tpc.googlesyndication.com
track.adform.net
try.abtasty.com
tvtoday.de
uip.semasio.net
uobsoe.com
ups.xplosion.de
uss.xplosion.de
www.google-analytics.com
www.googletagmanager.com
www.googletagservices.com
www.tvtoday.de
x.bidswitch.net
xpl.theadex.com
104.109.68.123
13.35.253.56
136.243.21.26
136.243.25.85
136.243.37.233
136.243.51.134
136.243.51.224
146.148.8.25
148.251.180.141
151.106.72.75
178.250.0.130
178.250.2.89
18.153.11.13
185.29.132.21
185.33.223.218
192.229.233.4
193.0.160.128
195.216.249.67
2.18.232.130
2001:16e0:10a:1::c1:1
2001:16e0:10a:1::c2:1
216.239.36.21
216.58.207.34
23.8.13.231
2600:9000:200d:f000:1c:8c89:a300:93a1
2a00:1450:4001:808::2002
2a00:1450:4001:808::2008
2a00:1450:4001:814::2002
2a00:1450:4001:815::2001
2a00:1450:4001:816::2002
2a00:1450:4001:816::200e
2a00:1450:4001:81f::2002
2a00:1450:4001:821::2006
2a00:1450:400c:c04::9c
2a02:26f0:6c00:18b::1142
2a02:26f0:6c00:194::1142
2a02:26f0:6c00:292::30fb
2a02:26f0:6c00:29e::1eae
34.245.249.125
34.251.201.192
35.190.75.210
37.157.4.25
37.157.5.73
37.157.6.251
37.252.172.42
52.210.188.80
52.216.170.117
52.30.21.185
52.31.228.50
52.94.220.16
54.228.202.240
54.36.123.231
54.77.75.246
74.125.206.156
77.66.11.200
78.46.71.136
85.10.231.199
85.114.144.194
85.114.159.118
85.114.159.93
85.215.5.31
89.163.159.116
91.215.100.39
91.215.103.65
99.86.1.198
001d751111062119cbdf69e62f97ba43a204b72feef82bb11e119c5c595c9c7c
02e7bffef726df712252d19c16336c993b5494611f5d352a044be1c0e4906c19
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06042f6ac2063c8e23fcce2c7c64449bae470d34c4d46f97e145242158ef15f3
0aba76a13c2dc036f64b51ea80744ef352d44691bdca03fd9159e293d55ddd93
0b1d74d61a0f7af68241b6ee4c3f15731f4348ea91785d912f292edad42345a9
1540c430a85d4b953a5992f3ea0f0c7fc1e3220972ec1326e6379b289bb364c2
1556e80f2449b238ae34da15f72fb533d48e51c91463d21e0f8ac92d1687dff6
1871b817beac6e0b21e74a9f2805db9a7dc028d78f8e8bc9bc70a5172a537f9d
1bfb94c4c4ed58fa8d0c81006a568c3f4d7efc4c453c58b11115ad6cf57d8e87
1d5b7c64458f4af91dcfee0354be47adde1f739b5aded03a7ab6068a1bb6ca97
1efd8ab2a1f424622cd7b18c157fb6d369a5a9b4fab6d263dc370a7ff0227095
20cfc11806c999249ef96695c308fd11909d29f2a15ffcdf9029418e48e5ea9a
221b5b41caa4e3c443fcb5d2464e87bd75b365977d4d9ba22f2c3f27d5240c00
22f138e2189f2659b3f920aaf4cb81963493984091199acf38dbb3db7be3235d
28645074de9b2587a42c2317b5876b375d933409b068567bb62d26e7316f6510
29fe06bb2e99792d95a10cc599d53241dffa8ebb049529463d1377b3853ca18c
2c2cae5fc5bde21218079735e70884e3c8f93abcc206017982451d05e247ca32
2e8be3db490ca247b8e122884af0656339a4acf8066b5e5e32663ef7e3fa1ef6
2fcbe9ed682b16557f66e6fd4e7fa33b647eb54f921f4a3c37c526fb30ba45ab
30da2bff9b5cb0f94b04c9c21ec607dfb1b46cf706802a093185036b333f89e6
331b05ab63a9fc51ff711345c41007cd9e450ab4ba93d623d2455df04878e5b9
3352122affbcb9159a20c61141787d520d073690392c2729487a06f96ac4d5a5
3a80b900c538dce6ded080e90ee6a3e25c9264181192f962dc62959412020681
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3e552578c7d450b023f2cd9d28f830be4335c3acc6c4ab6dadda0769f09e5f22
3ee079327ca98fa867616dbc2388dda9b94848b8fe7c945ff97374f29c3a219d
401a531c518c60170d8f34f3328c5709518b8a2f298fb0b337a4b7dacc8034df
427db4db07d8392ed795bd9ba409a8233aa312434c293134cadfb4b6e10bf311
47477b1178b46d92a83dde21b73232675ef517ffccef425ac61f4fdc64a7578a
4a11c08c6b7d91b62dee33bb90d77d6d66cad424efc987dc58293438238dbfe6
4b862283bb0b7628d0a044ee87ae769795382c60338e8690c5bd9a65261aec44
4c4d3fdd3e31ec7a3811940e30551d9ebb0b85d907a9d82e0a659c6059e1fa35
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
50178c2908dd13de5a387ee5e197029dd5aa0c24692fb2360c54b7484d03d75d
572f227bbf51f2208700c3ec30ede998397c41025df48e7f349401340e518a65
5aabd9fa7e1bf5a35a251ecb464bef2c3a5e36e7c636ff36479cff033e876d44
5c4e12a94c9666b7892be28c3945c2d47b74fb45dbb8399aab3520fc9aa9b08e
5d0b1a0361d7a2702f537cd8f319b4fec6ccc98846154947e116bf9371555a3e
5e5d1645c20cafb581df0db6f9c4c0e598f135ccd79179355386f6f13d63a7b9
5f35632bdd2009567cace35075eacaaab1b4e2337c0afb5b202d789c7f8ef9c4
6123e96ff7cf04d289732d7e18ac89faf3cf3a87ae05e2701d3e4350b3e063ce
6183084e0dd1f27cdee54267d943b02a256226bfc96c0b1b38aee9dad0f03922
62214dab0c26ba36487bfa2d0498b0931ca9c8e20a2864b55ff509e3876d8692
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f
665bb776a8d5f2ffa819a20db94a9eb1e76082c28b687819a69c4ec1c82a2a03
6b3c93443bcda766e5f470c2eaa7dc961ef4dbe7f0c5acd908785c85f486d889
6b80a1405a50545516934837dd11f58a29aa0bf2a352638ab6df4b6a3af0afca
6d6f482982f8f1a1814e279ff50df4ccc301533ca9655e4d080d6b90ec69d69e
6e8f2eb028fba047efa8d84eeea5d1faffe522882d0ad7c1bbd5c26edda5cbfa
7181a1b250d59ed460bac1f8266cf4a71f09c61b04b05d115f85b65b60a70d55
75246a1e61827f8f7c48f4586e087796203774f2682a0c265b1a31673e782a55
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
784f74aeb09cf67166da8d9d4af4f74d171f56b6fe6aa04637c8e287e68579bf
7a2e7a80d7542d5e8ae0beeb3abd52a5f0346c99cca5ffa4c0f222699abfe64d
819e38d1705b6a3a165ff3c0337e386f788b4e8aa945288a8663213b088919c4
822ad4383665cea954758d8bcc2b11f8cfcd1591df89d3a447f02ef8776a27be
82e749665c7912ccff1cd83d97600274bf39815363ef0b6cc95d5fc5a9475dc1
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8414f5a2f16a12e666a1bd297d4542fb9228bf63a41c462736c9ef8a27274121
85cda4d55bcace5081124025c8f8a4d9ed4bebc5ef464e9aa880c84f7cb9783c
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7
8d40ddd8b0eb636bac9b795654e04c5c1cb6b3a23930f19c4a3f3e30948d3f8d
8e2a0000fea4e9d693f81d08162b6869398a72409ddbcedc9dbefd9f60129212
90572652134ef7ebcc6f1db54ede6867e6d7bb6e39ee3c0a1d55504209f281cc
91992bdf0daf1087fc919e76ce021bed4b012ac6f55002a482ea806461427398
926e92bce6accb3a396d84c31824c1b88df2cde50353887afc0d1b8166f375ca
965da6de11a4974a588ced6376b8d14f2bbc50c0b71fd828c3116bc9b78260b5
980d6fa4df75cfde06e7b860869703578ee87d973054da47e871c1549225c5d0
990d396de690cd1ab62d91422f1e9d486cd37f4ac44d65b56b731c57f9824595
9998f48bc55669d8dc39505b2b36fdf4cb5856a0ff25b55e34b1862484f7b29e
99ef19af14fb27bec3b68c815d921454cfa00cfe14ba94f5f01dce32896d8d00
9a7be551755cd40ac554a0106394e6c3f757feac8149e8a0e0f8dcd08b1e0e4d
9a9652ae43c223bce750767dec9e20a0aa367db811bc2648726f5dab37418267
9bd4590052d32b30481265f9aa5f69f47c7de0a47e8e13ec3aea75d758412daf
9be147cf6c17fa19d98c59640f3c87f7141a82bf3c94355498759bc067c3fd73
9bf28f6cc36bd0a6e167ff8b916c07b5f23fc702b70ba0bd6d0e67582ebd20fd
9ce49a6036072f670176d60dfcd39ccfb8458af1f72af91cf028ef7d8c81570a
9d70d6b5316518c3a8856a3655156437e00baefd015180efabc83cd42302cced
a021a34e1ef503987176af22c07a35fc494035bb4469a664861487fe54968d36
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a1d3db8192b827a383ef379c9098656bc3c1d8fc7f7a4f92dbfd6d53ccc98378
a3d655eba58032b49685afe642464c7f99a47796da8779e287df104d9e4833c4
a53d4fc2cbe26e3ff420b03a578f7a3c7f8e2b828a467c46c7275301b329affa
a6322e263a6b71efdee765655e76099d0949ed19e0d6c239e18f37891d076293
a748da8e7e10ebee81953c33d0ae614cb1fddbecee249c5ed9a8d8c7713c438f
a94b21a79845154ed7ba59416e5e0cc38f3749512fb8a43234ba5319ba6b24d3
aa03dc59bdca72631d2301e4297cfa030bd31b907dc138e7b973d12311c90a22
ab55684011cfa46d3f5e819857e193747a32e8ba443cc8b89d4003dd50ca92d2
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b0e82f9ce6c1510f32a8e18c9581ba6573b6988dabdd3f2ed6c1ba08eff85cb9
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b51d1d78b0c6571240135468e9881fdf232a476bcbe1c8e6c6787dfbd5570821
b80a1c2830a3da9b32e26e266726d6533bcfeeaeee092b37a20913b13981dbce
b8f9041c9ccce47a551ea5223261dba12d749655f9e86aa6bfc81f0416e3ee90
bc8145c2ba10f812785e1dc461da00c2592b8939a95699b8870e4bd7da8c04a5
bda57e58dfbbcfd6573938c823862ac97cc109d9e0a16cc6c6aebda9302aeca0
be726dcabb9c264b1d1816ec0da60cb11fbb9b76afee12a82683d808a62a810c
be921d2261f5f97c8261f65a578929adfd0e4a0143f2d8cb123757dcd95e0265
bf6433080882816ede69d3317d486fa7fd2b63995f0e3bc7971465221e058c99
c11b9a046106f278a5fb5411e95c1ba5d6f06daf9e4bfa98da51c523e4157388
c88d4572cd3aba5bd8e3f77dd064e567d9930b5705ff064f799e23ff27dc0acc
cf65e308f1c461e06038b45d5bfa27689e22241f6b673b7d540d35cdd0ca4c32
d033f3bf9adb39b1aded5345a6731e4cf70ef85f0019b32464ebe55714c5a4cd
d4139cbcf4017cb369059548b41fe657c0d0c24284cd3192f073a0d65059fa69
d7414b3a412e2829b3c6a846fbf3038ee39bb472d77fba00a79632d41c2fea88
d87b4767c3740f29fce25054a43403b4656b2a476702546228982b62358287c1
dd11699e5bc91d667cc55e032cf45a9e599f3cebc0e3f71e2539e97ca8703d1f
dde5dcb64204bcf4f0aec18ca0a3b2ab0b6e7195cf6753d21344da3837cba921
ddfa922e4f9fcd81cf6ab8c51707fe681cf1001ad918e793eabeea5d8b2c6967
e0a3a169637315f45b887d677bd7d2cc1d00d404ccf681b529acbe31cbe87aea
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e5addc1019bb2afe99fe7a9786a1f201577d1bf2916dc40856008c9bf2700980
ea8709c333523eaa79e47d2670f5bbb49c469bf52de4d4c5d4b83571ec14da65
eb971385a90d4c4e88fc675ba6e407d4f496f9f9dcb149b79af5c69c08a43ef5
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f5a3fcda09f8e926c6be39da1d076f1f48b7e43750ad11dfb1d847ae8d3b431b
fa36d2f4799a846aeea4079c7cdf207ce1ffd27cb1314a9204b6778e70668252
fd03032845b23862ead920e257497d958f6bf1bc9c2b8285a0397d8c68c8c0e4
ffef71ef8678b044460c4f4b88c767cf04c918aca6ed3e7fe1f922fd5498a64e