URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Submission: On August 03 via manual from PL

Summary

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

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
7 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
4 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
3 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
16 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 52.222.147.181 16509 (AMAZON-02)
4 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 2 172.217.16.166 15169 (GOOGLE)
7 2.18.234.190 16625 (AKAMAI-AS)
1 52.94.216.48 16509 (AMAZON-02)
2 91.215.100.39 43407 (INFONLINE-AS)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 193.46.63.75 43407 (INFONLINE-AS)
2 3 91.215.103.65 43407 (INFONLINE-AS)
3 2a00:1450:400... 15169 (GOOGLE)
1 52.222.149.218 16509 (AMAZON-02)
4 2a02:26f0:10:... 20940 (AKAMAI-ASN1)
1 2a00:1450:400... 15169 (GOOGLE)
2 52.222.150.86 16509 (AMAZON-02)
1 1 34.240.31.64 16509 (AMAZON-02)
2 52.17.80.93 16509 (AMAZON-02)
1 54.194.160.217 16509 (AMAZON-02)
15 151.101.14.2 54113 (FASTLY)
9 74.201.198.92 13789 (INTERNAP-...)
7 64.202.112.28 23352 (SERVERCEN...)
1 2a00:1450:400... 15169 (GOOGLE)
7 31.24.80.101 56464 (VIBRANT-EU)
1 172.217.22.98 15169 (GOOGLE)
1 23.111.9.35 54104 (AS-STACKPATH)
1 46.51.178.72 16509 (AMAZON-02)
1 3 63.140.40.124 15224 (OMNITURE)
1 2600:9000:204... 16509 (AMAZON-02)
3 52.222.150.181 16509 (AMAZON-02)
1 52.212.57.107 16509 (AMAZON-02)
1 85.114.144.196 24961 (MYLOC-AS)
1 1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 1 85.114.159.118 24961 (MYLOC-AS)
1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 2 89.163.159.126 24961 (MYLOC-AS)
2 2a00:1450:400... 15169 (GOOGLE)
2 52.222.150.76 16509 (AMAZON-02)
1 52.84.122.124 16509 (AMAZON-02)
2 2 185.33.223.80 29990 (ASN-APPNEXUS)
1 2.18.234.21 16625 (AKAMAI-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 52.208.127.173 16509 (AMAZON-02)
1 2a02:26f0:10:... 20940 (AKAMAI-ASN1)
18 2.18.232.28 16625 (AKAMAI-AS)
2 52.222.150.31 16509 (AMAZON-02)
1 178.63.74.137 24940 (HETZNER-AS)
1 88.198.8.169 24940 (HETZNER-AS)
1 46.4.39.5 24940 (HETZNER-AS)
148 48
Apex Domain
Subdomains
Transfer
39 chip.de
www.chip.de
adtm.chip.de
ad-js.chip.de
filestorage.chip.de
videos.chip.de
rt.chip.de
somniture.chip.de
videoembed.chip.de
ssl.2.damoh.chip.de
ssl.1.damoh.chip.de
840 KB
38 outbrain.com
widgets.outbrain.com
amplify.outbrain.com
tr.outbrain.com
amplifypixel.outbrain.com
odb.outbrain.com
log.outbrain.com
115 KB
18 outbrainimg.com
images.outbrainimg.com
510 KB
9 intellitxt.com
k.intellitxt.com
images.intellitxt.com
61 KB
6 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
18 KB
5 svonm.com
hgc-cf-cache-1.svonm.com
54 KB
5 bf-tools.net
a.bf-tools.net
67 KB
4 bf-ad.net
a.bf-ad.net
45 KB
3 doubleclick.net
ad.doubleclick.net
securepubads.g.doubleclick.net
63 KB
2 adnxs.com
ib.adnxs.com
2 KB
2 googleapis.com
imasdk.googleapis.com
79 KB
2 theadex.com
xpl.theadex.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 xplosion.de
ups.xplosion.de
5 KB
2 emetriq.de
dyn.emetriq.de
cdn.emetriq.de
2 KB
2 conative.de
cdn.conative.de
73 KB
2 googlesyndication.com
pagead2.googlesyndication.com
27 KB
2 amazon-adsystem.com
c.amazon-adsystem.com
aax.amazon-adsystem.com
7 KB
1 2mdn.net
s0.2mdn.net
11 KB
1 casalemedia.com
ssum-sec.casalemedia.com
288 B
1 consensu.org
vibrant.mgr.consensu.org
1 adition.com
dsp.adfarm1.adition.com
486 B
1 yieldlab.net
p.yieldlab.net
471 B
1 speedcurve.com
cdn.speedcurve.com
5 KB
1 google.com
adservice.google.com
171 B
1 google.de
adservice.google.de
171 B
1 wfxtriggers.com
partners.wfxtriggers.com
397 B
1 googletagservices.com
www.googletagservices.com
8 KB
1 cloudfront.net
d3alqb8vzo7fun.cloudfront.net
51 KB
148 30
Domain Requested by
18 images.outbrainimg.com www.chip.de
10 adtm.chip.de www.chip.de
adtm.chip.de
10 www.chip.de www.chip.de
widgets.outbrain.com
8 log.outbrain.com widgets.outbrain.com
8 amplifypixel.outbrain.com www.chip.de
8 tr.outbrain.com www.chip.de
7 odb.outbrain.com widgets.outbrain.com
7 k.intellitxt.com ad-js.chip.de
k.intellitxt.com
images.intellitxt.com
www.chip.de
6 widgets.outbrain.com www.chip.de
widgets.outbrain.com
5 hgc-cf-cache-1.svonm.com filestorage.chip.de
text
5 videos.chip.de widgets.outbrain.com
www.chip.de
5 filestorage.chip.de www.chip.de
filestorage.chip.de
text
5 a.bf-tools.net www.chip.de
a.bf-tools.net
4 a.bf-ad.net www.chip.de
ad-js.chip.de
a.bf-ad.net
3 somniture.chip.de 1 redirects www.chip.de
3 de.ioam.de 2 redirects www.chip.de
2 ssl.2.damoh.chip.de text
2 ib.adnxs.com 2 redirects
2 images.intellitxt.com k.intellitxt.com
images.intellitxt.com
2 imasdk.googleapis.com filestorage.chip.de
imasdk.googleapis.com
2 xpl.theadex.com 1 redirects www.chip.de
2 d.df-srv.de 1 redirects www.chip.de
2 ups.xplosion.de www.chip.de
cdn.emetriq.de
2 cdn.conative.de a.bf-ad.net
cdn.conative.de
2 pagead2.googlesyndication.com ad-js.chip.de
www.chip.de
2 script.ioam.de adtm.chip.de
filestorage.chip.de
2 ad.doubleclick.net 1 redirects www.chip.de
1 ssl.1.damoh.chip.de text
1 adstax-match.adrtx.net cdn.adrtx.net
1 s0.2mdn.net imasdk.googleapis.com
1 ssum-sec.casalemedia.com www.chip.de
1 vibrant.mgr.consensu.org images.intellitxt.com
1 videoembed.chip.de filestorage.chip.de
1 dsp.adfarm1.adition.com 1 redirects
1 p.yieldlab.net www.chip.de
1 cdn.adrtx.net www.chip.de
1 cdn.emetriq.de ups.xplosion.de
1 rt.chip.de www.chip.de
1 cdn.speedcurve.com adtm.chip.de
1 securepubads.g.doubleclick.net www.googletagservices.com
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 partners.wfxtriggers.com a.bf-ad.net
1 dyn.emetriq.de 1 redirects
1 www.googletagservices.com a.bf-ad.net
1 amplify.outbrain.com www.chip.de
1 d3alqb8vzo7fun.cloudfront.net a.bf-tools.net
1 irqs.ioam.de script.ioam.de
1 aax.amazon-adsystem.com c.amazon-adsystem.com
1 ad-js.chip.de www.chip.de
1 c.amazon-adsystem.com www.chip.de
148 51
Subject Issuer Validity Valid
*.chip.de
GeoTrust RSA CA 2018
2018-06-07 -
2019-12-06
a year crt.sh
bf-tools.net
DigiCert ECC Secure Server CA
2018-07-26 -
2019-04-25
9 months crt.sh
rt.chip.de
Amazon
2018-01-09 -
2019-02-09
a year crt.sh
somniture.chip.de
DigiCert SHA2 High Assurance Server CA
2017-07-24 -
2018-10-25
a year crt.sh
vibrant.mgr.consensu.org
Amazon
2018-05-19 -
2019-06-19
a year crt.sh
*.googleapis.com
Google Internet Authority G3
2018-07-24 -
2018-10-02
2 months crt.sh
*.adrtx.net
Amazon
2017-10-25 -
2018-11-25
a year crt.sh
*.outbrain.com
DigiCert SHA2 Secure Server CA
2018-02-12 -
2019-02-12
a year crt.sh
ssl.1.damoh.chip.de
Let's Encrypt Authority X3
2018-07-24 -
2018-10-22
3 months crt.sh

This page contains 6 frames:

Primary Page: https://www.chip.de/downloads/Move-Mouse_102198245.html
Frame ID: 63A46B4CC2661639BF0382044A48EF04
Requests: 152 HTTP requests in this frame

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

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

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

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

Frame: https://widgets.outbrain.com/nanoWidget/externals/obFrame/obFrame.htm
Frame ID: DD9F3E522E5919BBEC25144990EACC68
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

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

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

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

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

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

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

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

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

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

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

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

Page Statistics

148
Requests

29 %
HTTPS

31 %
IPv6

30
Domains

51
Subdomains

48
IPs

5
Countries

2039 kB
Transfer

5767 kB
Size

6
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 10
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145164108;dc_trk_aid=316834968;dc_trk_cid=78557170;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1533285382 HTTP 302
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145164108;dc_pre=CIaz677A0NwCFVIX4Aodu_EHwQ;dc_trk_aid=316834968;dc_trk_cid=78557170;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1533285382
Request Chain 24
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000d&i2=000dd4248442378e75b641784&ep=1556916614&vr=409&id=s9k4qs&lt=1533286276649&ev=&cs=1t6sg0&mo=0 HTTP 302
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000d&i2=000dd4248442378e75b641784&ep=1556916614&vr=409&id=s9k4qs&lt=1533286276649&ev=&cs=1t6sg0&mo=0&sr=71 HTTP 302
  • https://de.ioam.de/blank.gif
Request Chain 43
  • https://dyn.emetriq.de/loader/91628/default.js HTTP 302
  • https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Request Chain 75
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s02907101041478?AQB=1&ndh=1&pf=1&t=3%2F7%2F2018%208%3A51%3A17%205%200&D=D%3D&fid=0199A6F6A048473B-1B9AF299F78AAE34&ce=UTF-8&pageName=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D7&c1=D%3Dv7&v2=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&c3=D%3Dv15&v4=Weekday%7CFriday%7C10%3A30AM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=tuning%20system&c8=c1_downloads&v8=maus%20tastatur-tools&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.chip.de&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c36=First%20page%20view%20or%20cookies%20not%20supported&c37=michael%20humpa&c38=visible&c40=n%2Fa&c42=D%3Dv42&v42=Video%3A%20Roboter%20sticht%20perfekte%20Tattoos&v43=7&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Ctuning_amp_system%7Cmaus_amp_tastatur_tools%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=53353401&v60=n%2Fa&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v84=n%2Fa&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1 HTTP 302
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s02907101041478?AQB=1&pccr=true&vidn=2DB20BC285310B41-60000103A00045C8&&ndh=1&pf=1&t=3%2F7%2F2018%208%3A51%3A17%205%200&D=D%3D&fid=0199A6F6A048473B-1B9AF299F78AAE34&ce=UTF-8&pageName=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D7&c1=D%3Dv7&v2=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&c3=D%3Dv15&v4=Weekday%7CFriday%7C10%3A30AM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=tuning%20system&c8=c1_downloads&v8=maus%20tastatur-tools&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.chip.de&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c36=First%20page%20view%20or%20cookies%20not%20supported&c37=michael%20humpa&c38=visible&c40=n%2Fa&c42=D%3Dv42&v42=Video%3A%20Roboter%20sticht%20perfekte%20Tattoos&v43=7&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Ctuning_amp_system%7Cmaus_amp_tastatur_tools%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=53353401&v60=n%2Fa&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v84=n%2Fa&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Request Chain 86
  • 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=6585414415135471640
Request Chain 87
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasBs73WD7FWsBZWsf-BiUABifkBD7sBDfABifABifABfrr HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001717901051170127&axd_pid=22&axd_fuid=BSasBs73WD7FWsBZWsf-BiUABifkBD7sBDfABifABifABfrr
Request Chain 95
  • https://ib.adnxs.com/getuid?https%3A%2F%2Fk.intellitxt.com%2Fcsync%2F0%2Fappnexus%2F%24UID HTTP 302
  • https://ib.adnxs.com/bounce?%2Fgetuid%3Fhttps%253A%252F%252Fk.intellitxt.com%252Fcsync%252F0%252Fappnexus%252F%2524UID HTTP 302
  • https://k.intellitxt.com/csync/0/appnexus/4525383635311927196

148 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Move-Mouse_102198245.html
www.chip.de/downloads/
211 KB
83 KB
Document
General
Full URL
https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
95d61b83d7c77c95c81335f4ac68d8e35cbd5e98fcc5c7f90342ae86b61cfa80

Request headers

Host
www.chip.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
63A46B4CC2661639BF0382044A48EF04

Response headers

Server
nginx
Content-Type
text/html
Vary
Accept-Encoding
Content-Encoding
gzip
SSL
YES
Content-Length
85218
Cache-Control
public, max-age=1
Expires
Fri, 03 Aug 2018 08:51:17 GMT
Date
Fri, 03 Aug 2018 08:51:16 GMT
Connection
keep-alive
ads_fol_init.js
a.bf-ad.net/makabo/
33 B
377 B
Script
General
Full URL
https://a.bf-ad.net/makabo/ads_fol_init.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28b::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
9ed3a2ae1ef227fdc6f09c78bcc9a1e590da910c1c276f96b2aaf86d6c4a952e

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 12 Oct 2016 15:59:48 GMT
Server
Apache
ETag
"e409fb3ff6dc33e64c3e5eefe750ace8:1476288013"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
53
cmp.js
a.bf-tools.net/cmp/
180 KB
53 KB
Script
General
Full URL
https://a.bf-tools.net/cmp/cmp.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:195::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 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
Transfer-Encoding
chunked
Connection
keep-alive, Transfer-Encoding
Accept-Ranges
bytes
download-v1.5.9.css
www.chip.de/download/assets/
300 KB
42 KB
Stylesheet
General
Full URL
https://www.chip.de/download/assets/download-v1.5.9.css
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
e4da1d289ab89639768b2685742ead0e6c31997e6b29d241cdcc4427998d1a64

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 29 Jun 2018 14:49:16 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
42808
Expires
Sat, 20 Jul 2019 07:27:17 GMT
speedtestwidget-v1.5.9.css
www.chip.de/download/assets/
79 KB
11 KB
Stylesheet
General
Full URL
https://www.chip.de/download/assets/speedtestwidget-v1.5.9.css
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
dfd9bd92ae5147930219f47fd1db6dc3de97b1287f5f453a549fc6e838abba0f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 29 Jun 2018 14:49:17 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
text/css
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
11047
Expires
Sat, 20 Jul 2019 07:26:31 GMT
simple-dom.php
www.chip.de/downloader/guided-download/
26 KB
8 KB
Script
General
Full URL
https://www.chip.de/downloader/guided-download/simple-dom.php?pid=chipde&cid=102198244&lastchange=01-06-2018_15:36&tid=38998&v=1&isDefault=false&ref=&canonical=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
f3115bdfa715bd4b11f6f2f8e61eab795b87b83ead55e369e84999ec8a9ef93a

Request headers

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

Response headers

Pragma
cache
Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
public, max-age=1319
Connection
keep-alive
SSL
YES
Content-Length
8069
Expires
Fri, 03 Aug 2018 09:13:15 GMT
satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/
106 KB
31 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
f0675646f823878872beeb1f3c71a2168a06c04ceea0d44bea88945ae8a8875f

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
last-modified
Mon, 30 Jul 2018 06:00:03 GMT
server
AkamaiNetStorage
etag
"138daf281696bc71aaa91d0af07d7af2:1532930403.512366"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=294
accept-ranges
bytes
timing-allow-origin
*
content-length
31188
expires
Fri, 03 Aug 2018 08:56:10 GMT
amzn_ads.js
c.amazon-adsystem.com/aax2/
20 KB
7 KB
Script
General
Full URL
https://c.amazon-adsystem.com/aax2/amzn_ads.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
52.222.147.181 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-147-181.fra53.r.cloudfront.net
Software
Server /
Resource Hash
2db28c63e026d1d3ef854b17e8190f85d1b985091d12c31377c8a25c1154abcd

Request headers

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

Response headers

Date
Thu, 02 Aug 2018 20:55:04 GMT
Content-Encoding
gzip
Server
Server
Age
42971
ETag
97b26fe1ab412522c4d4dcfc4ee18b68
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 3283735112d0a322451d32ef038129c9.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
6807
X-Amz-Cf-Id
vdAo9bwyhpoX8eQXTbghb0CCrJeYK91xBG0j6NC55FeGSQznymxMXA==
9232.min.js
ad-js.chip.de/js/chip/
142 KB
39 KB
Script
General
Full URL
https://ad-js.chip.de/js/chip/9232.min.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
4a0410b862577f6503362c01f94a209138923c2ad938a644d671637223787129

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Wed, 01 Aug 2018 11:51:13 GMT
Server
Apache
ETag
"bc77efbece5b410506f9a8fb87785c86:1533124275"
Vary
Accept-Encoding
Content-Type
text/javascript; charset=utf-8
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
40101
0e914dcc5ea68d3e.jpg
www.chip.de/ii/5/3/3/5/3/4/0/1/
11 KB
12 KB
Image
General
Full URL
https://www.chip.de/ii/5/3/3/5/3/4/0/1/0e914dcc5ea68d3e.jpg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
a188f6df5840a642b02697830db24e8201ac8df6320fa27010db41b96c7cfbef

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Mon, 24 Oct 2016 11:24:54 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/jpeg
Cache-Control
public, max-age=29452042
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
11522
Expires
Wed, 10 Jul 2019 05:58:38 GMT
bootstrap.88c36d866245388602ce.bundle.js
filestorage.chip.de/videoplayer/
31 KB
11 KB
Script
General
Full URL
https://filestorage.chip.de/videoplayer/bootstrap.88c36d866245388602ce.bundle.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
eea0f5e0ee839da79c5eb6fc620986856bedbc3d1d6f1e3d1204d662a6f73f1f

Request headers

:path
/videoplayer/bootstrap.88c36d866245388602ce.bundle.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
filestorage.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
last-modified
Mon, 30 Jul 2018 09:38:33 GMT
server
Apache
status
200
etag
"a4bce324b54eed698ff5737e8d93824c:1532943513"
vary
Accept-Encoding
access-control-allow-methods
GET,POST
content-type
application/x-javascript
access-control-allow-origin
*
access-control-max-age
86400
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
11440
B10860713.145164108;dc_pre=CIaz677A0NwCFVIX4Aodu_EHwQ;dc_trk_aid=316834968;dc_trk_cid=78557170;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=
ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/
Redirect Chain
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145164108;dc_trk_aid=316834968;dc_trk_cid=78557170;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1533285382
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145164108;dc_pre=CIaz677A0NwCFVIX4Aodu_EHwQ;dc_trk_aid=316834968;dc_trk_cid=78557170;ord=[timestamp];dc_lat=;dc_rdid=;tag_for...
42 B
318 B
Image
General
Full URL
https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145164108;dc_pre=CIaz677A0NwCFVIX4Aodu_EHwQ;dc_trk_aid=316834968;dc_trk_cid=78557170;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1533285382
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
172.217.16.166 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f166.1e100.net
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

pragma
no-cache
date
Fri, 03 Aug 2018 08:51:16 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
42
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Fri, 03 Aug 2018 08:51:16 GMT
x-content-type-options
nosniff
server
cafe
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
302
content-type
text/html; charset=UTF-8
location
https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145164108;dc_pre=CIaz677A0NwCFVIX4Aodu_EHwQ;dc_trk_aid=316834968;dc_trk_cid=78557170;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1533285382
cache-control
no-cache, must-revalidate
follow-only-when-prerender-shown
1
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
outbrain.js
widgets.outbrain.com/
69 KB
26 KB
Script
General
Full URL
https://widgets.outbrain.com/outbrain.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
d94cd8606122ffb52098e3fdfed7e9886e8bee5414bc7058481e1cdb56e7ce7b

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Sun, 29 Jul 2018 08:40:04 GMT
Server
Apache
ETag
"8da9777c0a0f24d34b32e6ee7f157058:1532853604"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=604800
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
25790
installer_init-v1.5.9.js
www.chip.de/download/assets/
2 KB
1 KB
Script
General
Full URL
https://www.chip.de/download/assets/installer_init-v1.5.9.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
afd78436d7aa99bb2eaa5072f1f455a7e00fdf53c5cd9c19921b14e1c6c39b5f

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 29 Jun 2018 14:49:17 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
public, max-age=30588942
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
989
Expires
Tue, 23 Jul 2019 09:46:58 GMT
hook-v1.5.9.js
www.chip.de/download/assets/
296 KB
100 KB
Script
General
Full URL
https://www.chip.de/download/assets/hook-v1.5.9.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
7db88358fc27c1bd55e13e06a6439e4f564a5c5bd75843413eff22a77f391c0e

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 29 Jun 2018 14:49:16 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
public, max-age=30588873
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
101614
Expires
Tue, 23 Jul 2019 09:45:49 GMT
satellite-5b192bd364746d5acf000a29.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
816 B
1 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b192bd364746d5acf000a29.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
8eecf0a2944ad09c2017e2351de3edd35017eb94e1f3f412e4c942701f9f0687

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b192bd364746d5acf000a29.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
last-modified
Mon, 23 Jul 2018 14:33:48 GMT
server
AkamaiNetStorage
etag
"305c5b6044d799c22ddef1af3f8e191f:1532356428.985189"
content-type
application/x-javascript
status
200
cache-control
max-age=77
accept-ranges
bytes
timing-allow-origin
*
content-length
816
expires
Fri, 03 Aug 2018 08:52:33 GMT
satellite-57c58fcc64746d7a93007e3e.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
1 KB
764 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57c58fcc64746d7a93007e3e.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
63014e0db08db9a1ba9a35d531d3ccefa158e33f53f436142550ef0d0acd5b5f

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57c58fcc64746d7a93007e3e.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
last-modified
Mon, 23 Jul 2018 14:33:45 GMT
server
AkamaiNetStorage
etag
"96e982946b194bcaffc7b790b9076db7:1532356425.953588"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=108
accept-ranges
bytes
timing-allow-origin
*
content-length
518
expires
Fri, 03 Aug 2018 08:53:04 GMT
satellite-5a0ef85764746d0bbd0091aa.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
97 B
350 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef85764746d0bbd0091aa.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
e832be11265d7211c4d6a39727d1f1dc0deb7225138ac6bb9627df33446b8477

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef85764746d0bbd0091aa.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
last-modified
Mon, 30 Jul 2018 06:00:19 GMT
server
AkamaiNetStorage
etag
"18529802fc6a5d1e92de7afe937f15f1:1532930419.984693"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=57
accept-ranges
bytes
timing-allow-origin
*
content-length
107
expires
Fri, 03 Aug 2018 08:52:13 GMT
bid
aax.amazon-adsystem.com/e/dtb/
33 B
212 B
Script
General
Full URL
https://aax.amazon-adsystem.com/e/dtb/bid?src=3128&u=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&cb=8457674&gdprl=%7B%22status%22%3A%22cmp-in-flight%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/amzn_ads.js
Protocol
HTTP/1.1
Server
52.94.216.48 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
8415221e077fe0cbd6b1cbe89f490ededbcbc4409fbc324c442173663717ee78

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Server
Server
Connection
keep-alive
Content-Length
33
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
hub.html
a.bf-tools.net/cmp/ Frame AEC0
0
0
Document
General
Full URL
https://a.bf-tools.net/cmp/hub.html
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/cmp/cmp.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
2a02:26f0:6c00:195::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash

Request headers

Host
a.bf-tools.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Accept-Encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
63A46B4CC2661639BF0382044A48EF04
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html

Response headers

Server
Apache
ETag
"2ee839a3b060ee26afa4a0b56891050a:1530611251"
Last-Modified
Tue, 03 Jul 2018 09:47:22 GMT
Accept-Ranges
bytes
Content-Type
text/html
Vary
Accept-Encoding
Content-Encoding
gzip
Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Length
5299
Connection
keep-alive
satellite-5a0ef80d64746d0bc600a756.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
125 B
384 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef80d64746d0bc600a756.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
681ab2e31f80632bba4a8d51c9722044a538f9dbb7b0c1279edb93cdce24d350

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef80d64746d0bc600a756.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
last-modified
Mon, 30 Jul 2018 06:00:20 GMT
server
AkamaiNetStorage
etag
"ec842dcaa4f0f12ac396afbeb19a4f8f:1532930420.95453"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=57
accept-ranges
bytes
timing-allow-origin
* *
content-length
124
expires
Fri, 03 Aug 2018 08:52:13 GMT
iam.js
script.ioam.de/
19 KB
7 KB
Script
General
Full URL
https://script.ioam.de/iam.js?m=1
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57c58fcc64746d7a93007e3e.js
Protocol
HTTP/1.1
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 000d
Resource Hash
77f724d56b3d3ceab091f94f97f25d8d20593d5414390430a56b40d3f96f1616

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 03 Aug 2018 08:51:16 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
Fri, 03 Aug 2018 10:51:16 GMT
1.1.1.33-BF-RELEASE.chunk.js
a.bf-tools.net/cmp/
6 KB
3 KB
Script
General
Full URL
https://a.bf-tools.net/cmp/1.1.1.33-BF-RELEASE.chunk.js
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/cmp/cmp.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:195::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 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
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2388
0.1.1.33-BF-RELEASE.chunk.js
a.bf-tools.net/cmp/
35 KB
10 KB
Script
General
Full URL
https://a.bf-tools.net/cmp/0.1.1.33-BF-RELEASE.chunk.js
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/cmp/cmp.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
1bfb94c4c4ed58fa8d0c81006a568c3f4d7efc4c453c58b11115ad6cf57d8e87

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 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
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
9442
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=chip&siteIdentifier=downloads&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.31322723447384204
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js?m=1
Protocol
SPDY
Server
193.46.63.75 Bonn, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

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

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
server
nginx
status
200
vary
Origin
content-type
application/vnd.api+json
access-control-allow-origin
https://www.chip.de
access-control-allow-credentials
true
strict-transport-security
max-age=15768000
blank.gif
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000d&i2=000dd4248442378e75b641784&ep=1556916614&vr=409&id=s9k4qs&lt=15...
  • https://de.ioam.de/tx.io?cp=downloads&st=chip&sv=i2&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.chip.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000d&i2=000dd4248442378e75b641784&ep=1556916614&vr=409&id=s9k4qs&lt=15...
  • https://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
https://de.ioam.de/blank.gif
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
image/gif
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Content-Length
43
Expires
Sat, 04 Aug 2018 08:51:16 GMT

Redirect headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.04.6 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
Fri, 03 Aug 2018 08:51:16 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/blank.gif
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Thu, 03 Aug 2017 08:51:16 GMT
de.js
a.bf-tools.net/de/
3 KB
2 KB
Script
General
Full URL
https://a.bf-tools.net/de/de.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
27f63f7730a4d8a7b430e3ebce56d29b14471a6b75b432b202d80df03d6550b8

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Tue, 05 Dec 2017 10:51:35 GMT
Server
Apache
ETag
"b2731bf0041a085a5af171a5bc73ed6a:1512471096"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1530
adengine.js
a.bf-ad.net/pubjs/chip/
159 KB
41 KB
Script
General
Full URL
https://a.bf-ad.net/pubjs/chip/adengine.js
Requested by
Host: ad-js.chip.de
URL: https://ad-js.chip.de/js/chip/9232.min.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28b::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
31d2b0075f674d07fad5a3cebf45a890e6a50dcb62c69d743104236104b28ae4

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 03 Aug 2018 08:34:08 GMT
Server
Apache
ETag
"c1f20765012aa0183fb8d52cccbbefee:1533285252"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Transfer-Encoding
chunked
Connection
keep-alive, Transfer-Encoding
Accept-Ranges
bytes
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
74 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: ad-js.chip.de
URL: https://ad-js.chip.de/js/chip/9232.min.js
Protocol
SPDY
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
dc4ebc15ba0d09ed863adb0bddf3f578bc5365aaaed89d20f879ac56bee92508
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27678
x-xss-protection
1; mode=block
server
cafe
etag
2274637023386634109
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Fri, 03 Aug 2018 08:51:16 GMT
truncated
/
59 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
0ddda9839c0f03c7cc800154368af8a65eeef1ad60c70559fa784d30f21b1165

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml;charset=utf-8
c8c3489e-f329-40e8-bcfc-1f852e512b01-1.0.js
d3alqb8vzo7fun.cloudfront.net/
344 KB
51 KB
Script
General
Full URL
https://d3alqb8vzo7fun.cloudfront.net/c8c3489e-f329-40e8-bcfc-1f852e512b01-1.0.js
Requested by
Host: a.bf-tools.net
URL: https://a.bf-tools.net/de/de.js
Protocol
SPDY
Server
52.222.149.218 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-149-218.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
2d368dd87d339ba2224b7f4060b1b27e5cbd2507094b989b67883abbb842a9d9

Request headers

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

Response headers

date
Thu, 02 Aug 2018 15:20:40 GMT
content-encoding
gzip
last-modified
Thu, 02 Aug 2018 15:17:38 GMT
server
AmazonS3
age
37
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/x-javascript
status
200
cache-control
max-age=300
x-amz-cf-id
GD52s3sQ40rZ6fOmnQlAvpcbnrGThhGluvoBMLuv547ehZ22IoEnJQ==
via
1.1 59574f77a7cf2d23d64904db278e5711.cloudfront.net (CloudFront)
main.88c36d866245388602ce.css
filestorage.chip.de/videoplayer/stylesheets/
71 KB
19 KB
Stylesheet
General
Full URL
https://filestorage.chip.de/videoplayer/stylesheets/main.88c36d866245388602ce.css
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/bootstrap.88c36d866245388602ce.bundle.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
ad3daafe03155cf72bb9c088764125f96475507d91b43e3646393e932a1a1363

Request headers

:path
/videoplayer/stylesheets/main.88c36d866245388602ce.css
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/css,*/*;q=0.1
cache-control
no-cache
:authority
filestorage.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
last-modified
Mon, 30 Jul 2018 09:38:38 GMT
server
Apache
status
200
etag
"b707b6445198ba6a48de7fd27915bf5a:1532943518"
vary
Accept-Encoding
access-control-allow-methods
GET,POST
content-type
text/css
access-control-allow-origin
*
access-control-max-age
86400
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
19451
videoplayer.88c36d866245388602ce.bundle.js
filestorage.chip.de/videoplayer/
427 KB
116 KB
Script
General
Full URL
https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/bootstrap.88c36d866245388602ce.bundle.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
ce5296d006c932c780d60805e93dbd0312e148b42cc60a03772a90f691d44ecd

Request headers

:path
/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
filestorage.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
last-modified
Mon, 30 Jul 2018 09:38:37 GMT
server
Apache
status
200
etag
"a9b6b2fd094a1a4cc539e74d9ed037c5:1532943517"
vary
Accept-Encoding
access-control-allow-methods
GET,POST
content-type
application/x-javascript
access-control-allow-origin
*
access-control-max-age
86400
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
obtp.js
amplify.outbrain.com/cp/
4 KB
2 KB
Script
General
Full URL
https://amplify.outbrain.com/cp/obtp.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
26c9c2ffd3d4ea43b62a3ac326dc386049bf49048f038e051f684dee2e4d88ca

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Mon, 11 Jun 2018 12:03:56 GMT
Server
Apache
ETag
"41f04bc9320bf2f0fe4cc3cbd05a460c:1528718636"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=1200
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1928
Expires
Fri, 03 Aug 2018 09:11:16 GMT
CHIP_Software_Deals_300x150.jpg
www.chip.de/download/assets/img/deals/
30 KB
31 KB
Image
General
Full URL
https://www.chip.de/download/assets/img/deals/CHIP_Software_Deals_300x150.jpg
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
1c86b047f9e6428cfbe4abc895303df8d2aad721d57136ec053476582d319226

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/download/assets/download-v1.5.9.css
Cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1533372676648; oil_data={%22opt_in%22:true%2C%22timestamp%22:1533286276664%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}}
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/download/assets/download-v1.5.9.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 09 Mar 2018 09:05:27 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/jpeg
Cache-Control
public, max-age=29447501
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
30928
Expires
Wed, 10 Jul 2019 04:42:57 GMT
truncated
/
305 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
323b3e828035a91dc4ebbdb9a38a2220d08404131f815649f83f2be870f40b60

Request headers

Response headers

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

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
18
videos.chip.de/p/1741931/thumbnail/entry_id/1_82cmb71o/width/640/height/360/
21 KB
22 KB
Image
General
Full URL
https://videos.chip.de/p/1741931/thumbnail/entry_id/1_82cmb71o/width/640/height/360/18
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:10:482::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
e8de0a9a36472bb459f1e6be7c7cddcc627051ce40a234f6de72f1ef5b49a6a4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
videos.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

X-Kaltura
cached-thumb-exists,3543988b6b185b5ddbbed535d279b544
X-Me
pa-front-thumb7
Date
Fri, 03 Aug 2018 08:51:16 GMT
X-Vod-Session
145865517
Connection
keep-alive
Content-Length
21808
Pragma
Last-Modified
Mon, 08 Aug 2016 08:01:47 GMT
Server
nginx
Vary
Accept-Encoding
X-Vod-Me
ny-front-vod4
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=3557
Accept-Ranges
bytes
X-Kaltura-Session
1929890092
Expires
Fri, 03 Aug 2018 09:50:33 GMT
truncated
/
4 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
870e27cad33d8dc47d855e12048aad477184ca7d45b5b6812f70ffc2b34b1649

Request headers

Response headers

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

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/jpeg
gpt.js
www.googletagservices.com/tag/js/
20 KB
8 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
SPDY
Server
2a00:1450:4001:812::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
d2042f11d6be3b4a1c4d5cbb8c0edf0d8857a9de215c29d8e4d38ba354991966
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"6 / 771 of 1000 / last-modified: 1533261456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
7808
x-xss-protection
1; mode=block
expires
Fri, 03 Aug 2018 08:51:16 GMT
bfa_infolayer_styles.css
a.bf-ad.net/packages/info-layer/chip/
1 KB
820 B
Stylesheet
General
Full URL
https://a.bf-ad.net/packages/info-layer/chip/bfa_infolayer_styles.css
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28b::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
a6a1913cb604f6626586e00b44f3d5a9efd6929752a59b87366d5f0ca70d39e4

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 13 Jul 2018 08:51:06 GMT
Server
Apache
ETag
"13446150d29adab64935a3c98d18ac19:1531471867"
Vary
Accept-Encoding
Content-Type
text/css
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
511
bfa_infolayer.js
a.bf-ad.net/packages/info-layer/chip/
6 KB
2 KB
Script
General
Full URL
https://a.bf-ad.net/packages/info-layer/chip/bfa_infolayer.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28b::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
98cab46844c5321e2681b64894ea3545cf9b80d86f41400ec60d015d57b02f06

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Content-Encoding
gzip
Last-Modified
Fri, 13 Jul 2018 08:51:06 GMT
Server
Apache
ETag
"4691f031530ac829a2d7ca74911f8211:1531471867"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1986
config.js
cdn.conative.de/serve/domain/chip_de/
61 KB
8 KB
Script
General
Full URL
https://cdn.conative.de/serve/domain/chip_de/config.js
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
52.222.150.86 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-86.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
14075887016597a1e33d48ee000f3fbf908748a56f6eb3347f29155ba481322e

Request headers

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

Response headers

Date
Thu, 02 Aug 2018 15:35:24 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 15:35:14 GMT
Server
AmazonS3
Age
951
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 a9e1c5fff6a2739d3f7026c216819292.cloudfront.net (CloudFront)
Cache-Control
max-age=1800
Transfer-Encoding
chunked
x-amz-tagging-count
1
Connection
keep-alive
X-Amz-Cf-Id
JkqEEotMxjLdoJydzZbsg77HFlvAx93RbnFGda-oVsN84pZi2Y1D7Q==
default.js
ups.xplosion.de/loader/91628/
Redirect Chain
  • https://dyn.emetriq.de/loader/91628/default.js
  • https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
52.17.80.93 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-17-80-93.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
c927695a6166edbfb66984db84b2913dcc6da4c9af0c0072dfd3807e660cd5b6

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1544

Redirect headers

Location
https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Date
Fri, 03 Aug 2018 08:51:16 GMT
Server
Apache-Coyote/1.1
Connection
keep-alive
Content-Length
0
/
partners.wfxtriggers.com/json/
243 B
397 B
Script
General
Full URL
https://partners.wfxtriggers.com/json/?resp_type=json&acctid=U87CFV&current=true&df=1,2,3&callback=jsonpCallback
Requested by
Host: a.bf-ad.net
URL: https://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
54.194.160.217 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-160-217.eu-west-1.compute.amazonaws.com
Software
openresty/1.7.7.1 /
Resource Hash
98d89e1bea9318d58557e82e4f04f43328e5166ea4d73f664159546dc6965a61

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:16 GMT
Server
openresty/1.7.7.1
Connection
keep-alive
Content-Length
243
Content-Type
text/plain
pixel
tr.outbrain.com/
43 B
288 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=001309801114355591
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.936575,VS0,VE80
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8120-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.20
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
293 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=001309801114355591
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
159 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=024879317307102577
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.936988,VS0,VE80
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8147-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.47
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=024879317307102577
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
168 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=05590216723142261
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.937026,VS0,VE80
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8148-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.48
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=05590216723142261
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
173 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=019833397600748381
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.994023,VS0,VE80
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8151-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.51
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=019833397600748381
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
159 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=0521690679915993
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.034101,VS0,VE80
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8140-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.40
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=0521690679915993
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
168 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=04321565152746325
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.034120,VS0,VE79
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8128-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.28
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=04321565152746325
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
116 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=019521636232606032
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.128579,VS0,VE80
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8148-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.48
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=019521636232606032
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
pixel
tr.outbrain.com/
43 B
168 B
Image
General
Full URL
https://tr.outbrain.com/pixel?marketerId=00057ca5dbe399df9cce707e0cb533aa0b&obApiVersion=1.0.10&name=PAGE_VIEW&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=019872849224135747
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-timer
S1533286277.128630,VS0,VE80
date
Fri, 03 Aug 2018 08:51:17 GMT
x-served-by
cache-jfk8136-JFK, cache-fra19138-FRA
x-cache
MISS, MISS
content-type
image/gif;
status
200
cache-control
no-cache
backend-ip
104.156.90.36
accept-ranges
bytes, bytes
via
1.1 varnish, 1.1 varnish
x-cache-hits
0, 0
pixel
amplifypixel.outbrain.com/
43 B
288 B
Image
General
Full URL
https://amplifypixel.outbrain.com/pixel?mid=00057ca5dbe399df9cce707e0cb533aa0b&dl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&bust=019872849224135747
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Cache-Control
no-cache
Transfer-Encoding
chunked
Content-Encoding
gzip
Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Type
image/gif;
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.chip.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:811::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.chip.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Fri, 03 Aug 2018 08:51:16 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
truncated
/
600 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
59eef289b63cafa1d3889e072a1cfefa5f7bf785b525eabcf3aef0002cb5533a

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
MarselisSlabWeb.woff2
www.chip.de/fec/assets/font/
27 KB
28 KB
Font
General
Full URL
https://www.chip.de/fec/assets/font/MarselisSlabWeb.woff2
Requested by
Host: www.chip.de
URL: https://www.chip.de/download/assets/hook-v1.5.9.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
92a1b0df334580a9784edb23c8b77fb0d9d617122cd953c4dc3c8c32b29d9f75

Request headers

Pragma
no-cache
Origin
https://www.chip.de
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1533372676648; oil_data={%22opt_in%22:true%2C%22timestamp%22:1533286276664%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}; chip_session=1
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Origin
https://www.chip.de

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Wed, 13 Jun 2018 11:41:12 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
application/font-woff2
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=235
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
27813
Expires
Fri, 03 Aug 2018 08:55:12 GMT
e2dec89d8c7e4a6c.jpg
www.chip.de/ii/5/3/3/5/3/4/0/1/
111 KB
104 KB
Image
General
Full URL
https://www.chip.de/ii/5/3/3/5/3/4/0/1/e2dec89d8c7e4a6c.jpg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
26c09cdd7f9117f8a775a0705c6f3a2450852ccfb5e6da407215ca4df73a7c31

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1533372676648; oil_data={%22opt_in%22:true%2C%22timestamp%22:1533286276664%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}; chip_session=1; CXOid=0.9342194541028748; s_fid=0199A6F6A048473B-1B9AF299F78AAE34; gpv=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D; s_vnum=1564822277165%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1533286277174
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Mon, 24 Oct 2016 11:24:54 GMT
Server
nginx
Vary
Accept-Encoding
Content-Type
image/jpeg
Cache-Control
public, max-age=30110075
Connection
keep-alive
Accept-Ranges
bytes
SSL
YES
Content-Length
106498
Expires
Wed, 17 Jul 2019 20:45:52 GMT
satellite-5a0c20e064746d476b0006bf.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
431 B
655 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0c20e064746d476b0006bf.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
9c3a8a4dcb7025502bbad37ed9eda1f0a4310c7f19d3effc381483f6f18095f5

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0c20e064746d476b0006bf.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
last-modified
Mon, 30 Jul 2018 06:00:10 GMT
server
AkamaiNetStorage
etag
"0aaab06ed50a5b4adf1f46cee6a37b03:1532930410.362576"
content-type
application/x-javascript
status
200
cache-control
max-age=108
accept-ranges
bytes
timing-allow-origin
*
content-length
431
expires
Fri, 03 Aug 2018 08:53:05 GMT
satellite-5a1fc54664746d108e0025fa.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
1 KB
821 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a1fc54664746d108e0025fa.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
9ce0815e04e67d2dde584322db795c23301b0794797fbcd84210d49bc89ad28a

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a1fc54664746d108e0025fa.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
last-modified
Mon, 23 Jul 2018 14:33:42 GMT
server
AkamaiNetStorage
etag
"1bbd204641533bb6cd622e5d702269da:1532356422.711698"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=20
accept-ranges
bytes
timing-allow-origin
*
content-length
578
expires
Fri, 03 Aug 2018 08:51:37 GMT
satellite-57ad808c64746d3e8d000ef0.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
12 KB
4 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57ad808c64746d3e8d000ef0.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
2ac0bda221cfdc311f691f5b9fa2729efdfdb485f16e54f8089c3fc3ef50d354

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57ad808c64746d3e8d000ef0.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
last-modified
Mon, 23 Jul 2018 14:33:39 GMT
server
AkamaiNetStorage
etag
"5e1418055bacf3067ad47441e9bbbf43:1532356419.332287"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=295
accept-ranges
bytes
timing-allow-origin
*
content-length
3573
expires
Fri, 03 Aug 2018 08:56:12 GMT
s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/
35 KB
13 KB
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
13d01a91a2551b2330cd623855b2adcda9f371d720eb02ef3adcf3a5dbffcf6a

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
last-modified
Mon, 23 Jul 2018 14:33:37 GMT
server
AkamaiNetStorage
etag
"02ca1a570d3d888e83ac86b30c9aeb8d:1532356417.111037"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=160
accept-ranges
bytes
timing-allow-origin
*
content-length
13386
expires
Fri, 03 Aug 2018 08:53:57 GMT
satellite-58b3dec264746d7415009f7b.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
97 B
359 B
Script
General
Full URL
https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-58b3dec264746d7415009f7b.js
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
96462e773b00c01a79cd885a78e923ea67fe8765c6d1ba38410133b222b34c71

Request headers

:path
/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-58b3dec264746d7415009f7b.js
pragma
no-cache
accept-encoding
gzip, deflate
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
*/*
cache-control
no-cache
:authority
adtm.chip.de
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
:scheme
https
:method
GET
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
last-modified
Mon, 30 Jul 2018 06:00:15 GMT
server
AkamaiNetStorage
etag
"f9e6fb38072864f7c23cb0a6b27cc98f:1532930415.882887"
vary
Accept-Encoding
content-type
application/x-javascript
status
200
cache-control
max-age=57
accept-ranges
bytes
timing-allow-origin
*
content-length
115
expires
Fri, 03 Aug 2018 08:52:14 GMT
front.asp
k.intellitxt.com/intellitxt/
2 KB
1 KB
Script
General
Full URL
https://k.intellitxt.com/intellitxt/front.asp?ipid=5154
Requested by
Host: ad-js.chip.de
URL: https://ad-js.chip.de/js/chip/9232.min.js
Protocol
HTTP/1.1
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
bc06a947d6a4cbdd08226c4dca598b6f60cd805acedc16d07717b230cef1a8cc

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Server
nginx
X-Powered-By
Kormorant
Vary
Accept-Encoding, *
Content-Type
text/html; charset=utf-8
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Fri, 08 Jan 2016 00:00:00 GMT
pubads_impl_236.js
securepubads.g.doubleclick.net/gpt/
179 KB
62 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_236.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
SPDY
Server
172.217.22.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s18-in-f2.1e100.net
Software
sffe /
Resource Hash
9108f8dcd5230b0f3ca08d7304f639dad3401bf6b12ca6079b0263d244af75cf
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Thu, 26 Jul 2018 18:18:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, immutable, max-age=31536000
accept-ranges
bytes
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
62994
x-xss-protection
1; mode=block
expires
Fri, 03 Aug 2018 08:51:17 GMT
lux.js
cdn.speedcurve.com/js/
14 KB
5 KB
Script
General
Full URL
https://cdn.speedcurve.com/js/lux.js?id=16151250
Requested by
Host: adtm.chip.de
URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0c20e064746d476b0006bf.js
Protocol
SPDY
Server
23.111.9.35 Phoenix, United States, ASN54104 (AS-STACKPATH - netDNA, US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
2e7c3de3b7b139a02ba310ff114665caa7c9716a26b3d7afa247466ea4c9a064
Security Headers
Name Value
Strict-Transport-Security max-age=2592000

Request headers

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

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
last-modified
Wed, 01 Aug 2018 22:39:37 GMT
server
NetDNA-cache/2.2
status
200
vary
Accept-Encoding,User-Agent
x-cache
HIT
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
max-age=604800
strict-transport-security
max-age=2592000
timing-allow-origin
*
expires
Wed, 08 Aug 2018 22:39:37 GMT
collect
rt.chip.de/
35 B
391 B
Image
General
Full URL
https://rt.chip.de/collect?t=live.track&cachebust=jkdr278k&rnd=d9230c40-8e97-4027-95e7-dd7b3772977b&ran=d9230c40-8e97-4027-95e7-dd7b3772977b&14=7350&uid=0.9342194541028748&ref=&url=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&tit=move%20mouse&id=53353401&bart=Downloads_Updates&layout=c1_downloads&ch=downloads&sch=tuning%20system&ssch=maus%20tastatur-tools&ivw=downloads&mob=stationaer&aut=michael%20humpa&can=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.51.178.72 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-46-51-178-72.eu-west-1.compute.amazonaws.com
Software
nginx/1.7.9 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
rt.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
CXOid=0.9342194541028748; s_fid=0199A6F6A048473B-1B9AF299F78AAE34; gpv=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D; s_vnum=1564822277165%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1533286277174
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
X-Content-Type-Options
nosniff
Last-Modified
Sun, 17 May 1998 03:00:00 GMT
Server
nginx/1.7.9
Content-Type
image/gif
Cache-Control
private, no-cache, no-cache=Set-Cookie, proxy-revalidate
Connection
keep-alive
Content-Length
35
Expires
Mon, 07 Aug 1995 23:30:00 GMT
Cookie set s02907101041478
somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/
Redirect Chain
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s02907101041478?AQB=1&ndh=1&pf=1&t=3%2F7%2F2018%208%3A51%3A17%205%200&D=D%3D&fid=0199A6F6A048473B-1B9AF299F78AAE34&ce=UTF-8&pageName=ir...
  • https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s02907101041478?AQB=1&pccr=true&vidn=2DB20BC285310B41-60000103A00045C8&&ndh=1&pf=1&t=3%2F7%2F2018%208%3A51%3A17%205%200&D=D%3D&fid=0199...
43 B
741 B
Image
General
Full URL
https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s02907101041478?AQB=1&pccr=true&vidn=2DB20BC285310B41-60000103A00045C8&&ndh=1&pf=1&t=3%2F7%2F2018%208%3A51%3A17%205%200&D=D%3D&fid=0199A6F6A048473B-1B9AF299F78AAE34&ce=UTF-8&pageName=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D7&c1=D%3Dv7&v2=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&c3=D%3Dv15&v4=Weekday%7CFriday%7C10%3A30AM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=tuning%20system&c8=c1_downloads&v8=maus%20tastatur-tools&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.chip.de&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c36=First%20page%20view%20or%20cookies%20not%20supported&c37=michael%20humpa&c38=visible&c40=n%2Fa&c42=D%3Dv42&v42=Video%3A%20Roboter%20sticht%20perfekte%20Tattoos&v43=7&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Ctuning_amp_system%7Cmaus_amp_tastatur_tools%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=53353401&v60=n%2Fa&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v84=n%2Fa&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
63.140.40.124 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
chip.de.ssl.sc.omtrdc.net
Software
Omniture DC/2.0.0 /
Resource Hash
a1ecbaed793a1f564c49c671f2dd0ce36f858534ef6d26b55783a06b884cc506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
somniture.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
CXOid=0.9342194541028748; s_fid=0199A6F6A048473B-1B9AF299F78AAE34; gpv=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D; s_vnum=1564822277165%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1533286277174; s_vi=[CS]v1|2DB20BC285310B41-60000103A00045C8[CE]
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.4.0
P3P
CP="This is not a P3P policy"
Connection
Keep-Alive
Content-Length
43
X-XSS-Protection
1; mode=block
Pragma
no-cache
Last-Modified
Sat, 04 Aug 2018 08:51:17 GMT
Server
Omniture DC/2.0.0
xserver
www26
ETag
"3292707207647395840-4654928725194834639"
Vary
*
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Set-Cookie
s_vi=[CS]v1|2DB20BC285310B41-60000103A00045C8[CE]; Expires=Sun, 2 Aug 2020 08:51:17 GMT; Domain=chip.de; Path=/
Keep-Alive
timeout=15
Expires
Thu, 02 Aug 2018 08:51:17 GMT

Redirect headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.4.0
P3P
CP="This is not a P3P policy"
Connection
Keep-Alive
Content-Length
0
X-XSS-Protection
1; mode=block
Pragma
no-cache
Last-Modified
Sat, 04 Aug 2018 08:51:17 GMT
Server
Omniture DC/2.0.0
xserver
www29
Location
https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s02907101041478?AQB=1&pccr=true&vidn=2DB20BC285310B41-60000103A00045C8&&ndh=1&pf=1&t=3%2F7%2F2018%208%3A51%3A17%205%200&D=D%3D&fid=0199A6F6A048473B-1B9AF299F78AAE34&ce=UTF-8&pageName=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D7&c1=D%3Dv7&v2=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&c3=D%3Dv15&v4=Weekday%7CFriday%7C10%3A30AM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=tuning%20system&c8=c1_downloads&v8=maus%20tastatur-tools&c10=D%3Dv8&v15=Downloads_Updates&c18=n%2Fa&v19=stationaer&v23=1&v25=www.chip.de&c28=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&v30=c1_downloads&c31=D%3Dv26&c32=n%2Fa&c36=First%20page%20view%20or%20cookies%20not%20supported&c37=michael%20humpa&c38=visible&c40=n%2Fa&c42=D%3Dv42&v42=Video%3A%20Roboter%20sticht%20perfekte%20Tattoos&v43=7&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Ctuning_amp_system%7Cmaus_amp_tastatur_tools%7Cartikel&c50=index%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c59=n%2Fa&c60=53353401&v60=n%2Fa&v66=D%3Dc28&v67=D%3Dc60&v68=n%2Fa&c70=D%3Dv70&v70=downloads&v72=PV-WD%20no&v84=n%2Fa&v89=n%2Fa&v92=n%2Fa&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Content-Type
text/plain
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Set-Cookie
s_vi=[CS]v1|2DB20BC285310B41-60000103A00045C8[CE]; Expires=Sun, 2 Aug 2020 08:51:17 GMT; Domain=chip.de; Path=/
Keep-Alive
timeout=15
Expires
Thu, 02 Aug 2018 08:51:17 GMT
adscript.min.js
cdn.conative.de/artifacts-v2/c2afc6bad791e1762c6f630acafcbb183f2b3ffe/
229 KB
65 KB
Script
General
Full URL
https://cdn.conative.de/artifacts-v2/c2afc6bad791e1762c6f630acafcbb183f2b3ffe/adscript.min.js
Requested by
Host: cdn.conative.de
URL: https://cdn.conative.de/serve/domain/chip_de/config.js
Protocol
HTTP/1.1
Server
52.222.150.86 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-86.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
5d7c227753d3f5ead14a740e273bc30bc5760e502bec49d2aa561871e6b9deb0

Request headers

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

Response headers

Date
Thu, 02 Aug 2018 15:06:06 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 15:03:01 GMT
Server
AmazonS3
Age
63912
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 a9e1c5fff6a2739d3f7026c216819292.cloudfront.net (CloudFront)
Cache-Control
public,max-age=31536000
Transfer-Encoding
chunked
Connection
keep-alive
X-Amz-Cf-Id
TBeGp-hkHVAo8-w-ngWaqUWz4YPpH2IbsTyiZgtdulRl2HjpwGJq5Q==
p.min.js
cdn.emetriq.de/adp/profiling/0.1.13/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Protocol
SPDY
Server
2600:9000:2047:0:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f

Request headers

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

Response headers

date
Wed, 31 May 2017 11:06:08 GMT
content-encoding
gzip
last-modified
Tue, 11 Apr 2017 11:21:30 GMT
server
AmazonS3
age
22151221
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
FiFeAFfpoMZPPyU16IPZd0oUAvReA_Mm
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
IC2RvPpXmCc_azXJVNbg2soHOpMcBb_X4qGn0tMyzQ6R2z-6CVtwNw==
via
1.1 e9cb084a7980d1028202eee7e07a5589.cloudfront.net (CloudFront)
global_config.json
hgc-cf-cache-1.svonm.com/
53 B
719 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/global_config.json
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Protocol
HTTP/1.1
Server
52.222.150.181 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-181.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 05:28:38 GMT
Via
1.1 1f95d1a95c6f2df8073daccac07b7570.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
21
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
53
Last-Modified
Fri, 03 Aug 2018 05:27:39 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
G3K4Z-lGpT27p9IfoNcOYogorWJxLclFMqP18JPW_PePvgDNfBge0g==
Expires
0
homadConfig.json
filestorage.chip.de/videoplayer//config/
323 B
677 B
XHR
General
Full URL
https://filestorage.chip.de/videoplayer//config/homadConfig.json
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Mon, 30 Jul 2018 09:38:39 GMT
Server
Apache
ETag
"bdd1fe062d58c3e9d9216922f317755d:1532943519"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
*
Content-Length
183
config.json
hgc-cf-cache-1.svonm.com/www.chip.de/
422 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.chip.de/config.json
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Protocol
HTTP/1.1
Server
52.222.150.181 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-181.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e

Request headers

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

Response headers

Date
Mon, 02 Jul 2018 09:52:55 GMT
Via
1.1 b7f7970e9c911e165d4cb9f70deac42a.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
3
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
422
Last-Modified
Mon, 02 Jul 2018 09:52:30 GMT
Server
AmazonS3
ETag
"2f988edff393a29c96e2df9109950ab1"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
uVgilLxOCC7w3looHydWrffMg8O-uVQoSwnCiPJfVVCCUQ4Qpm-IFg==
Expires
0
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Move%20Mouse%20-%20Download%20-%20CHIP&hostSiteUrl=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&event_id=page_view&_sid=91628&_ver=0.1.13&_seg=jsonp&_=342044202042
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Protocol
HTTP/1.1
Server
52.17.80.93 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-17-80-93.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
b70f1eb3c591b8a0c171b8998b03b348ebb363cb5db95d8a46ee415396b45637

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 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
1493
/
k.intellitxt.com/go/1/
4 KB
2 KB
Script
General
Full URL
https://k.intellitxt.com/go/1/?ipid=5154&consentstr={%22opt_in%22:true%2C%22timestamp%22:1533286276664%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}&consenttype=oil_data
Requested by
Host: k.intellitxt.com
URL: https://k.intellitxt.com/intellitxt/front.asp?ipid=5154
Protocol
HTTP/1.1
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
15d6f954a3433a3ca85aa6b7f6bf380c17f0c6e84917c910a6a15fb0e216c542

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Server
nginx
X-Powered-By
Kormorant
Vary
Accept-Encoding, *
Content-Type
text/javascript; charset=utf-8
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Fri, 08 Jan 2016 00:00:00 GMT
Cookie set s03988790094473
somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/
43 B
741 B
Image
General
Full URL
https://somniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s03988790094473?AQB=1&ndh=1&pf=1&t=3%2F7%2F2018%208%3A51%3A17%205%200&D=D%3D&fid=0199A6F6A048473B-1B9AF299F78AAE34&ce=UTF-8&pageName=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D&g=https%3A%2F%2Fwww.chip.de%2Fdownloads%2FMove-Mouse_102198245.html&ch=downloads&server=www.chip.de&events=event168&v70=downloads&pe=lnk_o&pev2=oil_shown&s=1600x1200&c=24&j=1.6&v=N&k=Y&bw=1600&bh=1200&AQE=1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
63.140.40.124 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
chip.de.ssl.sc.omtrdc.net
Software
Omniture DC/2.0.0 /
Resource Hash
a1ecbaed793a1f564c49c671f2dd0ce36f858534ef6d26b55783a06b884cc506
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
somniture.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
CXOid=0.9342194541028748; s_fid=0199A6F6A048473B-1B9AF299F78AAE34; gpv=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D; s_vnum=1564822277165%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1533286277174; s_vi=[CS]v1|2DB20BC285310B41-60000103A00045C8[CE]
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
X-Content-Type-Options
nosniff
X-C
ms-6.4.0
P3P
CP="This is not a P3P policy"
Connection
Keep-Alive
Content-Length
43
X-XSS-Protection
1; mode=block
Pragma
no-cache
Last-Modified
Sat, 04 Aug 2018 08:51:17 GMT
Server
Omniture DC/2.0.0
xserver
www29
ETag
"3292707207647395840-4814736144832939496"
Vary
*
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, no-transform, private
Set-Cookie
s_vi=[CS]v1|2DB20BC285310B41-60000103A00045C8[CE]; Expires=Sun, 2 Aug 2020 08:51:17 GMT; Domain=chip.de; Path=/
Keep-Alive
timeout=15
Expires
Thu, 02 Aug 2018 08:51:17 GMT
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
52.212.57.107 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-212-57-107.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

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

Response headers

Date
Tue, 31 Jul 2018 16:51:45 GMT
Content-Encoding
gzip
Last-Modified
Tue, 31 Jul 2018 16:51:31 GMT
Server
akka-http/10.1.3
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
m
p.yieldlab.net/
0
471 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=23666&ext_id=BSasBs73WD7FWsBZWsf-BiUABifkBD7sBDfABifABifABfrr&ddata_seg=e0
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
85.114.144.196 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
lb.yieldlab.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 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
Thu, 02 Aug 2018 08:51:17 GMT
a.js
d.df-srv.de/match/
Redirect Chain
  • https://d.df-srv.de/match/a.js?pid=42
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25
  • https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585414415135471640
3 B
466 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585414415135471640
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2001:16e0:10a:1::c1:1 , Germany, ASN12611 (RKOM R-KOM Regensburger Telekommunikations GmbH & Co. KG, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

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

Redirect headers

Location
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585414415135471640
Date
Fri, 03 Aug 2018 08:51:17 GMT
Server
nginx
Connection
keep-alive
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Transfer-Encoding
chunked
Expires
Thu, 01 Jan 1970 00:00:00 GMT
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasBs73WD7FWsBZWsf-BiUABifkBD7sBDfABifABifABfrr
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1001717901051170127&axd_pid=22&axd_fuid=BSasBs73WD7FWsBZWsf-BiUABifkBD7sBDfABifABifABfrr
43 B
717 B
Image
General
Full URL
https://xpl.theadex.com/d/327/i/2.gif?_sc=1001717901051170127&axd_pid=22&axd_fuid=BSasBs73WD7FWsBZWsf-BiUABifkBD7sBDfABifABifABfrr
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
89.163.159.126 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
Last-Modified
Fri, 03 Aug 2018 08:51:17 GMT
Server
nginx
P3P
CP="CAO PSA OUR"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Transfer-Encoding
binary
Connection
keep-alive
Access-Control-Allow-Credentials
true
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Server
nginx
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"
Location
https://xpl.theadex.com:443/d/327/i/2.gif?_sc=1001717901051170127&axd_pid=22&axd_fuid=BSasBs73WD7FWsBZWsf-BiUABifkBD7sBDfABifABifABfrr
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=UTF-8
1_82cmb71o
videoembed.chip.de/v3/videos/
1 KB
1 KB
Fetch
General
Full URL
https://videoembed.chip.de/v3/videos/1_82cmb71o
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
79e49b87b9b71ee642fe7ece0e58a38c0e4d5ce6c49bba5974e134ce8bb0189c

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
X-Server-Version
6.15.8
Server
nginx
Access-Control-Allow-Origin
*
SSL
YES
Vary
Accept-Encoding
Content-Type
application/json; charset=utf-8
X-FE-Version
1.22.0
Cache-Control
public, max-age=0
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-fancyBox
Content-Length
737
Expires
Fri, 03 Aug 2018 08:51:17 GMT
ima3.js
imasdk.googleapis.com/js/sdkloader/
231 KB
79 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Protocol
SPDY
Server
2a00:1450:4001:814::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
58d691bab385679733ace3e3897224239ec3f2550c6e747003cc6fbb8b612ca8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
80590
x-xss-protection
1; mode=block
expires
Fri, 03 Aug 2018 08:51:17 GMT
kormorant-1.28.03.min.js
images.intellitxt.com/k/
169 KB
48 KB
Script
General
Full URL
https://images.intellitxt.com/k/kormorant-1.28.03.min.js
Requested by
Host: k.intellitxt.com
URL: https://k.intellitxt.com/go/1/?ipid=5154&consentstr={%22opt_in%22:true%2C%22timestamp%22:1533286276664%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}&consenttype=oil_data
Protocol
SPDY
Server
52.222.150.76 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-76.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
c7784b7909c6de814e7098757f65f87f25dec4e8163332a8debedbe2412a56b7

Request headers

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

Response headers

date
Mon, 16 Jul 2018 11:00:41 GMT
content-encoding
gzip
last-modified
Mon, 16 Jul 2018 10:25:09 GMT
server
AmazonS3
age
1547437
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-id
itvPNyWAW4BrNcRelBYRm_HHUNZYob_YhEHerSGFrgSOOdqQARTdIw==
via
1.1 91db3e27f70759a0dea967c4b34efea9.cloudfront.net (CloudFront)
get
odb.outbrain.com/utils/
5 KB
3 KB
Script
General
Full URL
https://odb.outbrain.com/utils/get?url=https%3A%2F%2Fwww.chip.de&settings=true&recs=true&widgetJSId=SB_1&key=NANOWDGT01&idx=0&version=01004600&ref=&apv=false&sig=H3bXBO47&format=html&rand=95515&winW=1600&winH=1200&scrW=1600&scrH=1200&adblck=false&secured=true
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
ea76437570ff0096dc9037babcce5468a832d516ec73519ef00dbc9ac10c86a8
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-cache
MISS, MISS
p3p
policyref="http://www.outbrain.com/w3c/p3p.xml",CP="NOI NID CURa DEVa TAIa PSAa PSDa OUR IND UNI"
status
200
x-cache-hits
0, 0
x-served-by
cache-jfk8150-JFK, cache-fra19138-FRA
pragma
no-cache
x-timer
S1533286277.466633,VS0,VE105
date
Fri, 03 Aug 2018 08:51:17 GMT
vary
Accept-Encoding, User-Agent
content-type
text/x-json; charset=UTF-8
via
1.1 varnish, 1.1 varnish
cache-control
no-cache
backend-ip
104.156.90.50
accept-ranges
bytes, bytes
expires
Thu, 01 Jan 1970 00:00:00 GMT
readconsent.html
vibrant.mgr.consensu.org/ Frame 2E89
0
0
Document
General
Full URL
https://vibrant.mgr.consensu.org/readconsent.html
Requested by
Host: images.intellitxt.com
URL: https://images.intellitxt.com/k/kormorant-1.28.03.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.84.122.124 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-84-122-124.iad16.r.cloudfront.net
Software
AmazonS3 /
Resource Hash

Request headers

:method
GET
:authority
vibrant.mgr.consensu.org
:scheme
https
:path
/readconsent.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
63A46B4CC2661639BF0382044A48EF04
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html

Response headers

status
200
content-type
text/html
content-length
87
date
Thu, 24 May 2018 21:16:29 GMT
last-modified
Thu, 24 May 2018 20:20:03 GMT
etag
"d8bb22c98f002e29edc15d65b2a5c68c"
accept-ranges
bytes
server
AmazonS3
age
5543
x-cache
Hit from cloudfront
via
1.1 91e54ea7c5cc54f4a3500c72b19a2a23.cloudfront.net (CloudFront)
x-amz-cf-id
Rc_jqpLIGQM1SoATq_BYy4lAgcfh-PSsF2FgIXyLeuJg857K5iwZow==
kormorant-1.28.03.min.css
images.intellitxt.com/k/
26 KB
7 KB
Stylesheet
General
Full URL
https://images.intellitxt.com/k/kormorant-1.28.03.min.css
Requested by
Host: images.intellitxt.com
URL: https://images.intellitxt.com/k/kormorant-1.28.03.min.js
Protocol
SPDY
Server
52.222.150.76 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-76.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b0149cebf2aabd5f085727f8d89a2e95b844f0a646c69027c32d3027694e2a69

Request headers

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

Response headers

date
Mon, 16 Jul 2018 11:00:41 GMT
content-encoding
gzip
last-modified
Mon, 16 Jul 2018 10:25:09 GMT
server
AmazonS3
age
1547437
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/css
status
200
x-amz-cf-id
D-QFqvX7RP7w9ywaUVJJo_IvAwM2lRx2nhQTHm0g4tHWqT-dyDrA1Q==
via
1.1 91db3e27f70759a0dea967c4b34efea9.cloudfront.net (CloudFront)
1
k.intellitxt.com/context/
13 B
506 B
XHR
General
Full URL
https://k.intellitxt.com/context/1
Requested by
Host: images.intellitxt.com
URL: https://images.intellitxt.com/k/kormorant-1.28.03.min.js
Protocol
HTTP/1.1
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
a821ef2e57f7a813859e0757693071df87135628c3d8f017bc499d0322afeba6

Request headers

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

Response headers

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

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Server
nginx
Connection
keep-alive
X-Powered-By
Express
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"

Redirect headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:19 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 251.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.22:80
AN-X-Request-Uuid
2d0c6701-6969-469e-a6eb-2556d315f673
Server
nginx/1.13.4
Access-Control-Allow-Origin
*
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Location
https://k.intellitxt.com/csync/0/appnexus/4525383635311927196
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
usermatchredir
ssum-sec.casalemedia.com/
43 B
288 B
Image
General
Full URL
https://ssum-sec.casalemedia.com/usermatchredir?s=184543&cb=:redirect
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.234.21 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-21.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
Server
Apache
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
43
Expires
Fri, 03 Aug 2018 08:51:17 GMT
/
k.intellitxt.com/log/0/ptr/09ba111a2771b5104e59b9183dcfbb286d497c86/5154/9d1042ab-de3d-46a7-8096-3edb21897853/
0
230 B
Image
General
Full URL
https://k.intellitxt.com/log/0/ptr/09ba111a2771b5104e59b9183dcfbb286d497c86/5154/9d1042ab-de3d-46a7-8096-3edb21897853/
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
ETag
W/"a-b541a50d"
Server
nginx
X-Powered-By
Express
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Expires
0
100
videos.chip.de/p/1741931/sp/174193100/thumbnail/entry_id/1_82cmb71o/version/100011/acv/111/width/100/vid_slices/
151 KB
152 KB
Image
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/thumbnail/entry_id/1_82cmb71o/version/100011/acv/111/width/100/vid_slices/100
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:10:482::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
ec07ee3e82d47822b5d11e77405b38041d5139834294b7971007d051d6ed1a33

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
videos.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
CXOid=0.9342194541028748; s_fid=0199A6F6A048473B-1B9AF299F78AAE34; gpv=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D; s_vnum=1564822277165%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1533286277174; s_vi=[CS]v1|2DB20BC285310B41-60000103A00045C8[CE]
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

X-Kaltura
cached-thumb-exists,d59ee6f7532e9b5ca49d763944587d94
X-Me
ny-front-thumb9
Date
Fri, 03 Aug 2018 08:51:17 GMT
X-Vod-Session
1967810962
Connection
keep-alive
Content-Length
154914
Pragma
Last-Modified
Mon, 08 Aug 2016 08:01:47 GMT
Server
nginx
Vary
Accept-Encoding
X-Vod-Me
ny-front-vod4
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=3600
Accept-Ranges
bytes
X-Kaltura-Session
859756116
Expires
Fri, 03 Aug 2018 09:51:17 GMT
iam.js
script.ioam.de/
26 KB
9 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Protocol
HTTP/1.1
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 000d
Resource Hash
61a29f6265312b9cdf681af8cae1295b33bef2424797d92b104f66aefc8a19a5

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Fri, 03 Aug 2018 08:51:17 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
Fri, 03 Aug 2018 10:51:17 GMT
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
bridge3.225.0_en.html
imasdk.googleapis.com/js/core/ Frame B2A8
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.225.0_en.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:814::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.225.0_en.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
63A46B4CC2661639BF0382044A48EF04
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
163537
date
Fri, 27 Jul 2018 18:29:33 GMT
expires
Sat, 27 Jul 2019 18:29:33 GMT
last-modified
Fri, 27 Jul 2018 18:21:34 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
570104
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
client.js
s0.2mdn.net/instream/video/
26 KB
11 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
SPDY
Server
2a00:1450:4001:81d::2006 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 03 Aug 2018 08:51:17 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
10523
x-xss-protection
1; mode=block
expires
Fri, 03 Aug 2018 08:51:17 GMT
activation
adstax-match.adrtx.net/ Frame 47B8
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.208.127.173 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-208-127-173.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
Resource Hash

Request headers

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

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Fri, 03 Aug 2018 08:51:17 GMT
Server
akka-http/10.1.3
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
obFrame.htm
widgets.outbrain.com/nanoWidget/externals/obFrame/ Frame DD9F
0
0
Document
General
Full URL
https://widgets.outbrain.com/nanoWidget/externals/obFrame/obFrame.htm
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash

Request headers

Host
widgets.outbrain.com
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Accept-Encoding
gzip, deflate
Cookie
obuid=09f3532a-26d6-4d99-bf5c-dd98a5dc5b35; _ofcap_DOC1=AG8AZgBjAGEAcAACAAA=; recs_ff40053b147595adda83d2c5b3a9b540=D0
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
63A46B4CC2661639BF0382044A48EF04
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html

Response headers

Server
Apache
ETag
"93bc8d79697fcff213437857086f855d:1532853585"
Last-Modified
Sun, 29 Jul 2018 08:39:44 GMT
Accept-Ranges
bytes
Content-Type
text/html
Vary
Accept-Encoding
Content-Encoding
gzip
Cache-Control
max-age=604800
Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Length
2745
Connection
keep-alive
Access-Control-Allow-Credentials
false
Access-Control-Allow-Methods
GET,POST
Access-Control-Allow-Origin
*
get
odb.outbrain.com/utils/
33 KB
11 KB
Script
General
Full URL
https://odb.outbrain.com/utils/get?url=https%3A%2F%2Fwww.chip.de&settings=true&recs=true&widgetJSId=AR_1&key=NANOWDGT01&idx=1&version=01004600&ref=&apv=false&sig=H3bXBO47&format=html&rand=27806&lsd=09f3532a-26d6-4d99-bf5c-dd98a5dc5b35&t=MV9kYzkzZDUyMDA3MmU3NmRkMDg0MjQwMjRlOGQ3MzFkNF8w&winW=1600&winH=1200&scrW=1600&scrH=1200&adblck=false&secured=true
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
e194660bad3e94afa85d2918e88ea6e09cae3e138d1982bacaecd3329f39ae82
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-cache
MISS, MISS
p3p
policyref="http://www.outbrain.com/w3c/p3p.xml",CP="NOI NID CURa DEVa TAIa PSAa PSDa OUR IND UNI"
status
200
x-cache-hits
0, 0
x-served-by
cache-jfk8139-JFK, cache-fra19138-FRA
pragma
no-cache
x-timer
S1533286278.718723,VS0,VE124
date
Fri, 03 Aug 2018 08:51:17 GMT
vary
Accept-Encoding, User-Agent
content-type
text/x-json; charset=UTF-8
via
1.1 varnish, 1.1 varnish
cache-control
no-cache
backend-ip
104.156.90.39
accept-ranges
bytes, bytes
expires
Thu, 01 Jan 1970 00:00:00 GMT
1
k.intellitxt.com/context/
213 B
692 B
XHR
General
Full URL
https://k.intellitxt.com/context/1
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
7882943eb93f1e84954c8a6f24c46f14698762ef22b39f32066bdbeb1976ddc3

Request headers

Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Origin
https://www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/json

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
Server
nginx
X-Powered-By
Kormorant
Vary
*
Content-Type
application/json; charset=utf-8
Access-Control-Allow-Origin
https://www.chip.de
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
Content-Type
Content-Length
213
Expires
Fri, 08 Jan 2016 00:00:00 GMT
hd-main.js
hgc-cf-cache-1.svonm.com/
184 KB
50 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=HhjcaGsozd
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js
Protocol
HTTP/1.1
Server
52.222.150.181 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-181.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
62d79df14cd7c855ebdc917e294b9e303ddd2a0c18a598bb8dc23fed081a0b36

Request headers

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

Response headers

Date
Tue, 24 Jul 2018 07:38:34 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
14
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Tue, 24 Jul 2018 07:35:54 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 b7f7970e9c911e165d4cb9f70deac42a.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
ypo7XazZ74KK7qHrU5557eKT0kUzZ0bUvUVL9dDgL-wg8H0K-5MT1w==
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_82cmb71o/v/1/flavorId/1_8pu5fxrd/name/
169 KB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_82cmb71o/v/1/flavorId/1_8pu5fxrd/name/a.mp4
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:10:498::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

Pragma
no-cache
Accept-Encoding
identity;q=1, *;q=0
Host
videos.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
chrome-proxy
frfr
Accept
*/*
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
CXOid=0.9342194541028748; s_fid=0199A6F6A048473B-1B9AF299F78AAE34; gpv=ir-53353401%20%7C%20move%20mouse%20%5Bdownloads%20%3E%20tuning%20syst%5D; s_vnum=1564822277165%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1533286277174; s_vi=[CS]v1|2DB20BC285310B41-60000103A00045C8[CE]
Connection
keep-alive
Range
bytes=0-
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Range
bytes=0-
chrome-proxy
frfr

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Access-Control-Allow-Methods
GET, HEAD, OPTIONS
X-Vod-Session
1094982742
Content-Range
bytes 0-12270087/12270088
Connection
keep-alive
Content-Length
12270088
Last-Modified
Sun, 19 Nov 2000 08:52:00 GMT
Server
nginx
ETag
"3a1794b0-bb3a08"
X-Vod-Me
ny-front-vod4
Content-Type
video/mp4
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Server,Content-Length,Content-Range,Date
Cache-Control
max-age=8640000
Accept-Ranges
bytes
Access-Control-Allow-Headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
Expires
Sun, 11 Nov 2018 08:51:17 GMT
truncated
/
184 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
62d79df14cd7c855ebdc917e294b9e303ddd2a0c18a598bb8dc23fed081a0b36

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/javascript
smartFeed.js
widgets.outbrain.com/nanoWidget/01004600/module/
25 KB
8 KB
Script
General
Full URL
https://widgets.outbrain.com/nanoWidget/01004600/module/smartFeed.js
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
6c01cde0c8d5f459cb9e9ea2ca9215fee96ec684daa065f6764bcb6dd6908d65

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Sun, 29 Jul 2018 08:39:09 GMT
Server
Apache
ETag
"6dc70fc2d251b59feb7c3ad4b88d8b98:1532853549"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*, *
Cache-Control
max-age=604800
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
7702
eyJpdSI6IjMzMDcwNzc1M2MxM2I1Yjg3NzhlZDM2YmQ5ZmUyN2VhZTE3YTI5NTcxYTE3ZTI0NzQ1ZjNjZTVlYjA5ZjgxZTUiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
3 KB
2 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjMzMDcwNzc1M2MxM2I1Yjg3NzhlZDM2YmQ5ZmUyN2VhZTE3YTI5NTcxYTE3ZTI0NzQ1ZjNjZTVlYjA5ZjgxZTUiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
300235e615aade724cc540cd8900b304b80757ab3a4c927f440cdc58ea53007b

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Sat, 07 Jul 2018 21:01:18 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2238113
Connection
keep-alive
Content-Length
2287
eyJpdSI6ImZiMDE2MDJiOTM5NWEwMmM5NzYyMzA1Zjk4ZjM2ZWEwYWU0YmNiYmUzYjY2NDllM2Y1YzYxNDMwZWU3MjIwODciLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
16 KB
16 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6ImZiMDE2MDJiOTM5NWEwMmM5NzYyMzA1Zjk4ZjM2ZWEwYWU0YmNiYmUzYjY2NDllM2Y1YzYxNDMwZWU3MjIwODciLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
8d364c6603a2ee60db689778be810551eba9df445f2df82b1f233ef453a2912d

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Fri, 20 Jul 2018 07:35:24 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=1250486
Connection
keep-alive
Content-Length
16441
eyJpdSI6IjQ5NzI0ZWVhYzMwMzViYWE1NTdiOTA0NmRmMzkxNzA0ODM1ZmM5NDYxODhiMTAxZDgzODliYzRjNDFjY2ExMmEiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
10 KB
11 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjQ5NzI0ZWVhYzMwMzViYWE1NTdiOTA0NmRmMzkxNzA0ODM1ZmM5NDYxODhiMTAxZDgzODliYzRjNDFjY2ExMmEiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
84ae89a8caae26b3a43ce8047acb4336d93491fb2858d839d8074563a85eb5ba
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Encoding
gzip
Last-Modified
Wed, 16 May 2018 16:00:01 GMT
Date
Fri, 03 Aug 2018 08:51:17 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2380175
Connection
keep-alive
Content-Length
10545
eyJpdSI6IjFjYmE4ZGIwYWM3ZjVlNTkwOWRjNjdmMGY3MzUyNzUwNWQwOGMyNzdjNGEwYWVkZjQ0MzdiYTEyZDAzZGNjMjIiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
10 KB
10 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjFjYmE4ZGIwYWM3ZjVlNTkwOWRjNjdmMGY3MzUyNzUwNWQwOGMyNzdjNGEwYWVkZjQ0MzdiYTEyZDAzZGNjMjIiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
3fe73a53f661d46251360332a2e36c5f2c3f538981705f268f1bea1ec741c343

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Sun, 22 Jul 2018 14:21:37 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2016572
Connection
keep-alive
Content-Length
9808
eyJpdSI6IjFmNGMzNTliODFmYTQ1MzJhYmM2YWM2ZGU4MGM5OTBlY2MyY2ZkNzgxZjNiYzNiY2JlYWFlNTcyZTI1NDM2ZGQiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
12 KB
12 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjFmNGMzNTliODFmYTQ1MzJhYmM2YWM2ZGU4MGM5OTBlY2MyY2ZkNzgxZjNiYzNiY2JlYWFlNTcyZTI1NDM2ZGQiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
52713637ad2eb40dc4645f58021b0493cb0475dab0b52b4ef845f63b0b1b12fc

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Wed, 25 Jul 2018 10:23:28 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=1691486
Connection
keep-alive
Content-Length
11872
play_100x100.png
widgets.outbrain.com/images/widgetIcons/
9 KB
10 KB
Image
General
Full URL
https://widgets.outbrain.com/images/widgetIcons/play_100x100.png
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
bbcd8c21e24392c2c8ef2c5df39578e95b2bff035be4930cbc53b996087783a6

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Last-Modified
Thu, 02 Aug 2018 14:28:04 GMT
Server
Apache
ETag
"25a69b3019e3b959aef033482762080f:1533220084"
Access-Control-Allow-Methods
GET,POST
Content-Type
image/png
Access-Control-Allow-Origin
*, *
Cache-Control
max-age=604800
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
9422
eyJpdSI6IjhhNGNlYmYwZDYwOGI1MTE1ZDI0ZTZhZTEzNGVlMDY2ZWI0MzIyZWExMDIyYzk1OTVmMzU0MDg4NGFkNWNhODkiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
10 KB
10 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjhhNGNlYmYwZDYwOGI1MTE1ZDI0ZTZhZTEzNGVlMDY2ZWI0MzIyZWExMDIyYzk1OTVmMzU0MDg4NGFkNWNhODkiLCJ3IjozMDAsImgiOjE3MCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
c29b262d9c088605e70dd81c16105f94afb582fc5380da65ae27bec7cb9febe4
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Encoding
gzip
Last-Modified
Mon, 30 Jul 2018 11:54:28 GMT
Date
Fri, 03 Aug 2018 08:51:17 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2128021
Connection
keep-alive
Content-Length
9828
1
k.intellitxt.com/ad/
60 B
613 B
Script
General
Full URL
https://k.intellitxt.com/ad/1?callback=vib_1&ipid=5154&pvu=9d1042ab-de3d-46a7-8096-3edb21897853&kw=&audiences=&contextKey=09ba111a2771b5104e59b9183dcfbb286d497c86&liveLookup=false&intext.ids=943884686%2C2077437211%2C-28124829%2C943884686%3A716%3Ainview&intext.sets=&intext.bidders=%255B%255D&intext.count=3&intext.internal=false&intext.autoreveal=false
Requested by
Host: images.intellitxt.com
URL: https://images.intellitxt.com/k/kormorant-1.28.03.min.js
Protocol
HTTP/1.1
Server
31.24.80.101 , United Kingdom, ASN56464 (VIBRANT-EU, GB),
Reverse DNS
Software
nginx / Kormorant
Resource Hash
f76ef21e424630805039c01630d55159929b01149ee6fa74e144d233d3ce52be
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:17 GMT
X-Content-Type-Options
nosniff
Server
nginx
X-Powered-By
Kormorant
Vary
*
Content-Type
text/javascript; charset=utf-8
Cache-Control
private, no-cache, no-store, must-revalidate, proxy-revalidate, max-age=0
Connection
keep-alive
Content-Length
60
ETag
W/"3c-K1t+rY3lKUhG6ftSyTVO9cg/iHQ"
Expires
Fri, 08 Jan 2016 00:00:00 GMT
ob_smartFeedLogo.min.svg
widgets.outbrain.com/images/widgetIcons/
12 KB
12 KB
Image
General
Full URL
https://widgets.outbrain.com/images/widgetIcons/ob_smartFeedLogo.min.svg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
3e07c92fd7aea34df1623477ad28437df7186ba8ed84a7d116bfa528a7c34f48

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Last-Modified
Thu, 02 Aug 2018 14:28:02 GMT
Server
Apache
ETag
"2dc904a86222a14310658424f7d4ce6f:1533220082"
Access-Control-Allow-Methods
GET,POST
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*, *
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
12178
achoice.svg
widgets.outbrain.com/images/widgetIcons/
3 KB
2 KB
Image
General
Full URL
https://widgets.outbrain.com/images/widgetIcons/achoice.svg
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.234.190 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-234-190.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
2c87952cc1c23627496c7874271042bdb6af21efdf7cbf36ec4d98e6cec34d04

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:17 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 14:27:58 GMT
Server
Apache
ETag
"9d26fa4e7238ed94f1d0d92afb453b3e:1533220078"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
image/svg+xml
Access-Control-Allow-Origin
*, *
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1368
get
odb.outbrain.com/utils/
21 KB
6 KB
Script
General
Full URL
https://odb.outbrain.com/utils/get?url=https%3A%2F%2Fwww.chip.de&settings=true&recs=true&widgetJSId=SFD_STP_2&key=NANOWDGT01&idx=2&version=01004600&ref=&apv=true&sig=H3bXBO47&format=html&rand=1404&lsd=09f3532a-26d6-4d99-bf5c-dd98a5dc5b35&t=MV9kYzkzZDUyMDA3MmU3NmRkMDg0MjQwMjRlOGQ3MzFkNF8w&winW=1600&winH=1200&scrW=1600&scrH=1200&adblck=false&secured=true&fId=100&fAB=no_abtest&fCard=1&feedIdx=1
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
a3e5701ef5aabd13e54a5ed8ad668346179429fe554e5dcc92cb820eb52a6d91
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-cache
MISS, MISS
p3p
policyref="http://www.outbrain.com/w3c/p3p.xml",CP="NOI NID CURa DEVa TAIa PSAa PSDa OUR IND UNI"
status
200
x-cache-hits
0, 0
x-served-by
cache-jfk8138-JFK, cache-fra19138-FRA
pragma
no-cache
x-timer
S1533286278.917595,VS0,VE122
date
Fri, 03 Aug 2018 08:51:18 GMT
vary
Accept-Encoding, User-Agent
content-type
text/x-json; charset=UTF-8
via
1.1 varnish, 1.1 varnish
cache-control
no-cache
backend-ip
104.156.90.38
accept-ranges
bytes, bytes
expires
Thu, 01 Jan 1970 00:00:00 GMT
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=0&tm=1163&pid=3051&sid=235450&wId=102&wRV=01004600&rId=dc93d520072e76dd08424024e8d731d4&idx=0&pvId=dc93d520072e76dd08424024e8d731d4&org=0&pad=0&pVis=0&eIdx=&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=0&tm=1163&pid=3051&sid=235450&wId=100&wRV=01004600&rId=dd7223c5b76adf585fac21008a2508f1&idx=1&pvId=dc93d520072e76dd08424024e8d731d4&org=2&pad=3&pVis=1&eIdx=&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_82cmb71o/v/1/flavorId/1_8pu5fxrd/name/
206 KB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_82cmb71o/v/1/flavorId/1_8pu5fxrd/name/a.mp4
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:10:482::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

Pragma
no-cache
Accept-Encoding
identity;q=1, *;q=0
Host
videos.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Range
bytes=163840-
Accept
*/*
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Range
bytes=163840-

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET, HEAD, OPTIONS
X-Vod-Session
1094982742
Content-Range
bytes 163840-12270087/12270088
Connection
keep-alive
Content-Length
12106248
Last-Modified
Sun, 19 Nov 2000 08:52:00 GMT
Server
nginx
ETag
"3a1794b0-bb3a08"
X-Vod-Me
ny-front-vod4
Content-Type
video/mp4
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Server,Content-Length,Content-Range,Date
Cache-Control
max-age=8640000
Accept-Ranges
bytes
Access-Control-Allow-Headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
Expires
Sun, 11 Nov 2018 08:51:18 GMT
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=3&tm=1175&pid=3051&sid=235450&wId=102&wRV=01004600&rId=dc93d520072e76dd08424024e8d731d4&idx=0&pvId=dc93d520072e76dd08424024e8d731d4&org=0&pad=0&pVis=0&eIdx=0&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
truncated
/
43 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/gif
gen_204
pagead2.googlesyndication.com/pagead/
0
53 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?error=1012&vis=1&lid=7&sdkv=h.3.225.0&id=ima_html5&c=3254589975058417&domain=www.chip.de
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
SPDY
Server
2a00:1450:4001:806::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

pragma
no-cache
cache-control
no-cache, must-revalidate
content-type
text/html; charset=UTF-8
expires
Fri, 01 Jan 1990 00:00:00 GMT
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=0&tm=1224&pid=3051&sid=235450&wId=973&wRV=01004600&rId=d94d6675d1b1fa60f8639f454225ca87&idx=2&pvId=dc93d520072e76dd08424024e8d731d4&org=1&pad=1&pVis=1&eIdx=&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
get
odb.outbrain.com/utils/
23 KB
8 KB
Script
General
Full URL
https://odb.outbrain.com/utils/get?url=https%3A%2F%2Fwww.chip.de&settings=true&recs=true&widgetJSId=SFD_STP_3&key=NANOWDGT01&idx=3&version=01004600&ref=&apv=true&sig=H3bXBO47&format=html&rand=78216&lsd=09f3532a-26d6-4d99-bf5c-dd98a5dc5b35&t=MV9kYzkzZDUyMDA3MmU3NmRkMDg0MjQwMjRlOGQ3MzFkNF8w&winW=1600&winH=1200&scrW=1600&scrH=1200&adblck=false&secured=true&fId=100&fAB=no_abtest&fCard=2&feedIdx=1
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
8b1cbf22ff33d0baef587a0f9f3c790111b162e9e249e516253883abbd2b814b
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-cache
MISS, MISS
p3p
policyref="http://www.outbrain.com/w3c/p3p.xml",CP="NOI NID CURa DEVa TAIa PSAa PSDa OUR IND UNI"
status
200
x-cache-hits
0, 0
x-served-by
cache-jfk8136-JFK, cache-fra19138-FRA
pragma
no-cache
x-timer
S1533286278.055483,VS0,VE121
date
Fri, 03 Aug 2018 08:51:18 GMT
vary
Accept-Encoding, User-Agent
content-type
text/x-json; charset=UTF-8
via
1.1 varnish, 1.1 varnish
cache-control
no-cache
backend-ip
104.156.90.36
accept-ranges
bytes, bytes
expires
Thu, 01 Jan 1970 00:00:00 GMT
eyJpdSI6IjA3YzQ0YjdmNWJlNjM3N2I4ODY2NjcwYmQ2Yzc0NTY2NjRhNjNlNTM1MmEzYmJhNDQxOTk0YjI0ZDAzMzFiZTIiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
92 KB
92 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjA3YzQ0YjdmNWJlNjM3N2I4ODY2NjcwYmQ2Yzc0NTY2NjRhNjNlNTM1MmEzYmJhNDQxOTk0YjI0ZDAzMzFiZTIiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
057f3adda4aba500de10978bf47d055a9133071c6b854c7fc6c10adce4fd64c8

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Wed, 01 Aug 2018 07:06:19 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2382180
Connection
keep-alive
Content-Length
93847
eyJpdSI6ImIyNTRlNTQwYzMxZWRiYmE1ODQ1YzlkNTkxYjhhNjVkODg1YTJmYWNhMmZkODcwN2ZmNmJiOGJkNzQ0YzE4MDUiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
33 KB
34 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6ImIyNTRlNTQwYzMxZWRiYmE1ODQ1YzlkNTkxYjhhNjVkODg1YTJmYWNhMmZkODcwN2ZmNmJiOGJkNzQ0YzE4MDUiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
7f83c3c04c07bb630d6cd97a664c5d374a28568a73e1a2a2d664e5621e14974f

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Tue, 17 Jul 2018 17:29:14 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=1994120
Connection
keep-alive
Content-Length
34136
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_82cmb71o/v/1/flavorId/1_8pu5fxrd/name/
272 KB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_82cmb71o/v/1/flavorId/1_8pu5fxrd/name/a.mp4
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:10:482::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

Pragma
no-cache
Accept-Encoding
identity;q=1, *;q=0
Host
videos.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Range
bytes=360448-
Accept
*/*
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Accept-Encoding
identity;q=1, *;q=0
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Range
bytes=360448-

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET, HEAD, OPTIONS
X-Vod-Session
1094982742
Content-Range
bytes 360448-12270087/12270088
Connection
keep-alive
Content-Length
11909640
Last-Modified
Sun, 19 Nov 2000 08:52:00 GMT
Server
nginx
ETag
"3a1794b0-bb3a08"
X-Vod-Me
ny-front-vod4
Content-Type
video/mp4
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Server,Content-Length,Content-Range,Date
Cache-Control
max-age=8640000
Accept-Ranges
bytes
Access-Control-Allow-Headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
Expires
Sun, 11 Nov 2018 08:51:18 GMT
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=0&tm=1363&pid=3051&sid=235450&wId=978&wRV=01004600&rId=87901b0d777b746fabbfff86ce1b0350&idx=3&pvId=dc93d520072e76dd08424024e8d731d4&org=2&pad=1&pVis=1&eIdx=&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
get
odb.outbrain.com/utils/
20 KB
7 KB
Script
General
Full URL
https://odb.outbrain.com/utils/get?url=https%3A%2F%2Fwww.chip.de&settings=true&recs=true&widgetJSId=SFD_STP_2&key=NANOWDGT01&idx=4&version=01004600&ref=&apv=true&sig=H3bXBO47&format=html&rand=84196&lsd=09f3532a-26d6-4d99-bf5c-dd98a5dc5b35&t=MV9kYzkzZDUyMDA3MmU3NmRkMDg0MjQwMjRlOGQ3MzFkNF8w&winW=1600&winH=1200&scrW=1600&scrH=1200&adblck=false&secured=true&fId=100&fAB=no_abtest&fCard=3&feedIdx=1
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
80c9c3839dab10dafab40e8aae1d30866f5d86cbda2c41a33495afac8e2cee5c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-cache
MISS, MISS
p3p
policyref="http://www.outbrain.com/w3c/p3p.xml",CP="NOI NID CURa DEVa TAIa PSAa PSDa OUR IND UNI"
status
200
x-cache-hits
0, 0
x-served-by
cache-jfk8143-JFK, cache-fra19138-FRA
pragma
no-cache
x-timer
S1533286278.193675,VS0,VE118
date
Fri, 03 Aug 2018 08:51:18 GMT
vary
Accept-Encoding, User-Agent
content-type
text/x-json; charset=UTF-8
via
1.1 varnish, 1.1 varnish
cache-control
no-cache
backend-ip
104.156.90.43
accept-ranges
bytes, bytes
expires
Thu, 01 Jan 1970 00:00:00 GMT
eyJpdSI6IjMyNGFiZjE1ZTc5OGFiZmQxMTkyOGUwZTI5YmM1ZTdhNTc3NzdhODM0ZjI0NGRlMzI1ODA5ZWNmZWZkZTEyYmQiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
33 KB
33 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjMyNGFiZjE1ZTc5OGFiZmQxMTkyOGUwZTI5YmM1ZTdhNTc3NzdhODM0ZjI0NGRlMzI1ODA5ZWNmZWZkZTEyYmQiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
8f2360738f903a272fd946950bd8ad2bd3ea774424e92d9befc22170881f8998

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Tue, 26 Jun 2018 11:22:56 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=260696
Connection
keep-alive
Content-Length
33506
eyJpdSI6IjFjNDNhYTFhYjgxNWJlZTBlMzlhOThmY2Y2ZDAxNGJmOTVlY2M5YTU1NzZjNWUzNjM3NDRmNjcxZWY3Zjk0ZjciLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
79 KB
79 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjFjNDNhYTFhYjgxNWJlZTBlMzlhOThmY2Y2ZDAxNGJmOTVlY2M5YTU1NzZjNWUzNjM3NDRmNjcxZWY3Zjk0ZjciLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
20dd7cf689d88382b472e9738037b76453abe39258fef332ef45ca9f01433510
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Encoding
gzip
Last-Modified
Fri, 22 Jun 2018 10:53:15 GMT
Date
Fri, 03 Aug 2018 08:51:18 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=1430183
Connection
keep-alive
Content-Length
80990
eyJpdSI6IjhlYjAzY2FkNDFjZTRjMjhjNGE5MDVmY2ZhOWRkMTM4NGIyYWU1ZTIxNTlhM2I0ZDU2ZjMxZmQyMzIzNDc5NWYiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
69 KB
69 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjhlYjAzY2FkNDFjZTRjMjhjNGE5MDVmY2ZhOWRkMTM4NGIyYWU1ZTIxNTlhM2I0ZDU2ZjMxZmQyMzIzNDc5NWYiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
5b41a1725ba0086e0288e567c552813b991943eddee77c5f445ac3ec089eed08

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 10:34:15 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=1924786
Connection
keep-alive
Content-Length
70644
global_config.json
hgc-cf-cache-1.svonm.com/
53 B
719 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/global_config.json?cache=3814652324
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Server
52.222.150.31 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-31.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 05:28:38 GMT
Via
1.1 300b920cc4a53d2daec2ba8180596d82.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
22
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
53
Last-Modified
Fri, 03 Aug 2018 05:27:39 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
4RHMpQi15eu0tUGGh6B2hUQVBLPF286bv4WyomL2LY2B7r_0FeP-_Q==
Expires
0
homadConfig.json
filestorage.chip.de/videoplayer//config/
323 B
677 B
XHR
General
Full URL
https://filestorage.chip.de/videoplayer//config/homadConfig.json?cache=4200992111
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a02:26f0:6c00:198::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Mon, 30 Jul 2018 09:38:39 GMT
Server
Apache
ETag
"bdd1fe062d58c3e9d9216922f317755d:1532943519"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
false
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
*
Content-Length
183
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=0&tm=1507&pid=3051&sid=235450&wId=973&wRV=01004600&rId=afd60c9b23c3c7c79e91002e6ee9c3b9&idx=4&pvId=dc93d520072e76dd08424024e8d731d4&org=1&pad=1&pVis=1&eIdx=&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
get
odb.outbrain.com/utils/
24 KB
8 KB
Script
General
Full URL
https://odb.outbrain.com/utils/get?url=https%3A%2F%2Fwww.chip.de&settings=true&recs=true&widgetJSId=SFD_STP_3&key=NANOWDGT01&idx=5&version=01004600&ref=&apv=true&sig=H3bXBO47&format=html&rand=54046&lsd=09f3532a-26d6-4d99-bf5c-dd98a5dc5b35&t=MV9kYzkzZDUyMDA3MmU3NmRkMDg0MjQwMjRlOGQ3MzFkNF8w&winW=1600&winH=1200&scrW=1600&scrH=1200&adblck=false&secured=true&fId=100&fAB=no_abtest&fCard=4&feedIdx=1
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
e48c60faae9511bda1862d6d320a7cce59354c0ab7b9cf9177a521a6354eb71c
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-cache
MISS, MISS
p3p
policyref="http://www.outbrain.com/w3c/p3p.xml",CP="NOI NID CURa DEVa TAIa PSAa PSDa OUR IND UNI"
status
200
x-cache-hits
0, 0
x-served-by
cache-jfk8146-JFK, cache-fra19138-FRA
pragma
no-cache
x-timer
S1533286278.337822,VS0,VE120
date
Fri, 03 Aug 2018 08:51:18 GMT
vary
Accept-Encoding, User-Agent
content-type
text/x-json; charset=UTF-8
via
1.1 varnish, 1.1 varnish
cache-control
no-cache
backend-ip
104.156.90.46
accept-ranges
bytes, bytes
expires
Thu, 01 Jan 1970 00:00:00 GMT
eyJpdSI6IjU5ZWE0MDZkMjAzOTJkYjg0MGVmN2QwNWU2ZGY5NTFmZTU5Y2Y3NDBiOWU3MDQ4MTAyNWZhYjA3ZWYzM2M5ODciLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
24 KB
25 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjU5ZWE0MDZkMjAzOTJkYjg0MGVmN2QwNWU2ZGY5NTFmZTU5Y2Y3NDBiOWU3MDQ4MTAyNWZhYjA3ZWYzM2M5ODciLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
a6991a36268dbff95892876e313edda5f6ca116ae0c409c5ac452621d57d37ba

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Jul 2018 19:09:26 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2261047
Connection
keep-alive
Content-Length
24835
eyJpdSI6ImNhZTI1ZTg0ZjMwZDkwYWZmZGFmOWI4ZjhlYmVmMDVlZTA1MjkwMzhiZGQ4ZmVjYzVlMTJlYjM1Njk2MDU1NmEiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
7 KB
7 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6ImNhZTI1ZTg0ZjMwZDkwYWZmZGFmOWI4ZjhlYmVmMDVlZTA1MjkwMzhiZGQ4ZmVjYzVlMTJlYjM1Njk2MDU1NmEiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
185eb55666c350ee6eaddd5938c1a296d22497b805b958f3a53dd73e59e09110

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Fri, 03 Aug 2018 07:48:34 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2459603
Connection
keep-alive
Content-Length
6982
config.json
hgc-cf-cache-1.svonm.com/www.chip.de/
422 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.chip.de/config.json?cache=2580107349
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Server
52.222.150.31 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-31.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e

Request headers

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

Response headers

Date
Mon, 02 Jul 2018 09:52:55 GMT
Via
1.1 300b920cc4a53d2daec2ba8180596d82.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
4
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
422
Last-Modified
Mon, 02 Jul 2018 09:52:30 GMT
Server
AmazonS3
ETag
"2f988edff393a29c96e2df9109950ab1"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
X-Amz-Cf-Id
DvSuSaQFjRjMWrLn283Meq-kYhD3rZSol9UszQ1DAgOygOkf8QP4cA==
Expires
0
/
ssl.2.damoh.chip.de/aa96132536ace0da45eaa9178ff3900ef9d5c43f/
422 B
1 KB
XHR
General
Full URL
https://ssl.2.damoh.chip.de/aa96132536ace0da45eaa9178ff3900ef9d5c43f/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
178.63.74.137 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.137.74.63.178.clients.your-server.de
Software
AmazonS3 /
Resource Hash
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Connection
keep-alive
Content-Length
422
Last-Modified
Mon, 02 Jul 2018 09:52:30 GMT
Server
AmazonS3
Etag
"2f988edff393a29c96e2df9109950ab1"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.chip.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de5-homad-2
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.chip.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=0&tm=1644&pid=3051&sid=235450&wId=978&wRV=01004600&rId=54a082a90fc57894547230a98940c87e&idx=5&pvId=dc93d520072e76dd08424024e8d731d4&org=1&pad=1&pVis=1&eIdx=&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
74.201.198.92 , United States, ASN13789 (INTERNAP-BLK3 - Internap Network Services Corporation, US),
Reverse DNS
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
get
odb.outbrain.com/utils/
20 KB
7 KB
Script
General
Full URL
https://odb.outbrain.com/utils/get?url=https%3A%2F%2Fwww.chip.de&settings=true&recs=true&widgetJSId=SFD_STP_2&key=NANOWDGT01&idx=6&version=01004600&ref=&apv=true&sig=H3bXBO47&format=html&rand=85052&lsd=09f3532a-26d6-4d99-bf5c-dd98a5dc5b35&t=MV9kYzkzZDUyMDA3MmU3NmRkMDg0MjQwMjRlOGQ3MzFkNF8w&winW=1600&winH=1200&scrW=1600&scrH=1200&adblck=false&secured=true&fId=100&fAB=no_abtest&fCard=5&feedIdx=1
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
SPDY
Server
151.101.14.2 San Francisco, United States, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
Resource Hash
7f2744ba79d66e4987ebd29b1b349b1279cd5280506d5a66e959b0d05c063183
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

strict-transport-security
max-age=0; includeSubDomains;
content-encoding
gzip
traffic-path
NYDC1, JFK, FRA, Europe1
x-cache
MISS, MISS
p3p
policyref="http://www.outbrain.com/w3c/p3p.xml",CP="NOI NID CURa DEVa TAIa PSAa PSDa OUR IND UNI"
status
200
x-cache-hits
0, 0
x-served-by
cache-jfk8143-JFK, cache-fra19138-FRA
pragma
no-cache
x-timer
S1533286278.482521,VS0,VE119
date
Fri, 03 Aug 2018 08:51:18 GMT
vary
Accept-Encoding, User-Agent
content-type
text/x-json; charset=UTF-8
via
1.1 varnish, 1.1 varnish
cache-control
no-cache
backend-ip
104.156.90.43
accept-ranges
bytes, bytes
expires
Thu, 01 Jan 1970 00:00:00 GMT
eyJpdSI6IjM0YjczOGYxMTg4NWUzMjIxNjY3ZjVlYjk3NmU1YjFlNzU3OGNkNDM4N2Y2MjU1NzZjNTZmNTA1ZWNiZGY4N2QiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
24 KB
24 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjM0YjczOGYxMTg4NWUzMjIxNjY3ZjVlYjk3NmU1YjFlNzU3OGNkNDM4N2Y2MjU1NzZjNTZmNTA1ZWNiZGY4N2QiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
8dd0057a4780f0844f9fa17c4fa9d8badc7cec776afbf39de5877f98a43149fa

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Mon, 07 May 2018 16:44:42 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=1993173
Connection
keep-alive
Content-Length
24309
eyJpdSI6IjMzMDcwNzc1M2MxM2I1Yjg3NzhlZDM2YmQ5ZmUyN2VhZTE3YTI5NTcxYTE3ZTI0NzQ1ZjNjZTVlYjA5ZjgxZTUiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
6 KB
3 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjMzMDcwNzc1M2MxM2I1Yjg3NzhlZDM2YmQ5ZmUyN2VhZTE3YTI5NTcxYTE3ZTI0NzQ1ZjNjZTVlYjA5ZjgxZTUiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e6f13e2280a360fa0643e8a439549b7ecf73fb828fba659e50a6024dac3b9270

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Sun, 08 Jul 2018 03:09:49 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2245649
Connection
keep-alive
Content-Length
3104
eyJpdSI6ImQ4ODMwNTJkYzZlOTA0ZDAwNjVmYTAxMTFlMjNiNTRhNmVlYmEyNWQ5NzA3MGI1OGE5NDg2ZDYxODBmZDljNGIiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
40 KB
40 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6ImQ4ODMwNTJkYzZlOTA0ZDAwNjVmYTAxMTFlMjNiNTRhNmVlYmEyNWQ5NzA3MGI1OGE5NDg2ZDYxODBmZDljNGIiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
28a929860c3ba181aa072a93b54cc0fa18d6d280f36743ab70c086e6e178881b

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Wed, 27 Jun 2018 10:42:51 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=1493007
Connection
keep-alive
Content-Length
40674
hic_qos
ssl.1.damoh.chip.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.chip.de/hic_qos?adv_partner&_werbebanner_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
88.198.8.169 Nürnberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-198-8-169.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
ssl.1.damoh.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Fri, 03 Aug 2018 08:51:19 GMT
Last-Modified
Tue, 15 May 2018 12:29:22 GMT
Server
openresty/1.13.6.2
ETag
"5afad2a2-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
widgetGlobalEvent
log.outbrain.com/loggerServices/
4 B
299 B
Script
General
Full URL
https://log.outbrain.com/loggerServices/widgetGlobalEvent?eT=0&tm=1787&pid=3051&sid=235450&wId=973&wRV=01004600&rId=23e6a84c7dfb00c5bc76eec69c5ef599&idx=6&pvId=dc93d520072e76dd08424024e8d731d4&org=1&pad=1&pVis=1&eIdx=&ab=0&wl=0
Requested by
Host: widgets.outbrain.com
URL: https://widgets.outbrain.com/outbrain.js
Protocol
HTTP/1.1
Server
64.202.112.28 , United States, ASN23352 (SERVERCENTRAL - Server Central Network, US),
Reverse DNS
chi-only.outbrain.org
Software
/
Resource Hash
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b

Request headers

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

Response headers

Pragma
no-cache
Date
Fri, 03 Aug 2018 08:51:18 GMT
Access-Control-Allow-Methods
GET,POST
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Length
4
Expires
0
eyJpdSI6IjE2OTIzOTY0OGRjODhjNGE2NTMyMjNlZWE3NDA5OGRkNWNkZmYwY2VhNDVkMzE2ZGVhYzgxMzFhNmM1MDllNmMiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
14 KB
14 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjE2OTIzOTY0OGRjODhjNGE2NTMyMjNlZWE3NDA5OGRkNWNkZmYwY2VhNDVkMzE2ZGVhYzgxMzFhNmM1MDllNmMiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
2749e0f0c73fc0b4361c0329ea608862c87a12d860636c73e4772ec4b70b9a2c

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 08:51:18 GMT
Content-Encoding
gzip
Last-Modified
Fri, 06 Jul 2018 07:20:09 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=965468
Connection
keep-alive
Content-Length
14090
eyJpdSI6IjdjMTVmNWI4NmFmYjJhMjQ2YzNkNzE0Njg3ZmUyNWU1ZDMyNGM5M2QyMThmNzgzM2YwN2MxN2NkMzU0NTFiOWIiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
images.outbrainimg.com/transform/v3/
29 KB
29 KB
Image
General
Full URL
https://images.outbrainimg.com/transform/v3/eyJpdSI6IjdjMTVmNWI4NmFmYjJhMjQ2YzNkNzE0Njg3ZmUyNWU1ZDMyNGM5M2QyMThmNzgzM2YwN2MxN2NkMzU0NTFiOWIiLCJ3Ijo0NjcsImgiOjI2NCwiZCI6MS41LCJjcyI6MCwiZiI6MH0.webp
Requested by
Host: www.chip.de
URL: https://www.chip.de/downloads/Move-Mouse_102198245.html
Protocol
HTTP/1.1
Server
2.18.232.28 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-28.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
22dff1dde57d663f587ad3f35e403b7a0d318d583ff596130f003b5f2c33d328
Security Headers
Name Value
Strict-Transport-Security max-age=0; includeSubDomains;

Request headers

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

Response headers

Strict-Transport-Security
max-age=0; includeSubDomains;
Content-Encoding
gzip
Last-Modified
Fri, 20 Jul 2018 17:19:24 GMT
Date
Fri, 03 Aug 2018 08:51:18 GMT
Vary
Accept-Encoding
Content-Type
image/webp
Cache-Control
max-age=2234645
Connection
keep-alive
Content-Length
29749
/
ssl.2.damoh.chip.de/7495490d38d08f55951c5e5aaaae273a91dfc8cb/
109 B
670 B
XHR
General
Full URL
https://ssl.2.damoh.chip.de/7495490d38d08f55951c5e5aaaae273a91dfc8cb/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
46.4.39.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.39.4.46.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
480f7a2020234eb7d1f5745fbc8ec7f6535905cdeddda4a8b5d63bf6466c33c5

Request headers

Pragma
no-cache
Origin
https://www.chip.de
Accept-Encoding
gzip, deflate
Host
ssl.2.damoh.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Cookie
s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
Connection
keep-alive
Content-Length
371
Referer
https://www.chip.de/downloads/Move-Mouse_102198245.html
Origin
https://www.chip.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Fri, 03 Aug 2018 08:51:19 GMT
Server
TornadoServer/4.5.3
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.chip.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
109

Verdicts & Comments Add Verdict or Comment

289 JavaScript Global Variables

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

object| chip object| digitalData boolean| TfmediaExtFolEngineLoaded object| chip_currpage_json function| __cmp function| loadCSS boolean| isRedesignPage string| normalDlUrl string| downloadFileType boolean| downloaderAllowed boolean| downloaderDefinitelyBeingUsed 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| _satellite object| queue number| rand function| writeCookie function| readCookie undefined| _sp_ undefined| script undefined| parentElem object| amznpassback function| amzn_ads object| amznads function| aax_write function| amznMatchCookie function| aax_render_ad string| DsScreenshotUrl boolean| allowTemplateCalls number| afterDownloadCheckIntervall string| s_enabled string| s_disabled string| s_debug string| hostname number| redesign_serve_rate number| malwarepg_show_rate string| chip_service_baseurl string| installcore_hostname string| installcore_enabled string| revizer_hostname string| revizer_enabled number| revizer_serve_rate string| h2o_hostname string| h2o_enabled number| h2o_serve_rate number| payback_addon_serve_rate number| webcompanion_addon_serve_rate boolean| use_redirector number| randomizer_ttl string| initFunctionName string| initFunctionNameMac string| cipher string| currentLocation function| getQueryStringData function| getParameterByName function| contains function| removeURLParameter function| getBrowser function| getUserLanguage function| getUserCountry function| getOperatingSystem function| getWindowsVersion function| verifyHasAllRequiredParams function| base64decode function| utf8_decode undefined| DScalledAlready function| DYdid function| DYinit function| ExtensionInit function| DSget_cookie function| DSsetCookie function| DYrunDelay function| DYrun function| cacheIframe function| ExtensionRun function| initDownloadButtonsRedesign function| DSsimpleSerialize function| DYurlencode function| DYonHtmlAvailable function| DSredirectorLink function| DSgetStaticRandom function| partnerEnabled function| DSgetDownloaderHostname string| DSprotocolPrefix boolean| serveTheDownloader string| reasonForNotServingDownloader string| autoplay string| DSpid string| lastchange string| DSstaticCid string| DSsource string| DScategoryId string| DScategoryName string| isDefault string| DSref string| DSfilename boolean| bofb string| DScallType string| DSlastchange string| DYdivID string| mainContentDiv object| blacklistedTIDs string| DSbrowser string| DSuserLanguage function| checkIfDownloaderAllowed function| checkIfChromeExtensionAllowed function| dxNQIfNjcCsrHdsaKIRjffm function| WlKufTMjrzZaFNjIqCaX function| DHgetElementsByClassName boolean| paybackAllowed boolean| webcompanionAllowed string| os object| cdivw string| szmvars object| OEWA object| iom boolean| adtechNewLogic boolean| dealbarStatus object| _deq string| adtechPageType object| currpage string| adsc_async string| adsc_ressort string| adsc_rubrik string| adsc_adunit1 string| adsc_adunit2 string| adsc_adunit3 string| adsc_adunit4 string| adsc_adunit5 string| adsc_layout string| adsc_device boolean| adsc_mobile string| adsc_keyword string| adsc_contentwidth string| adsc_pageid string| adsc_referrer object| mediator boolean| passiveEventSupport object| vibrantConfig object| _caq undefined| tfss_towerbanner object| style object| TFMDFP function| getContentHeight function| stickyLooper function| stickySkyscraper object| AdSystemLoader object| googletag object| permutive string| version boolean| hasFEA string| playerCSS string| previewCSS string| currentPlayerCode function| webpackJsonp object| $scriptQueue boolean| cssLoaded boolean| previewCssLoaded function| obApi object| OBR string| OB_releaseVer function| OBR$ object| outbrain object| outbrain_rater boolean| TFM_adEngineHasRun object| TFM function| jsonpCallback number| timestamp_burn object| _aeq object| google_js_reporting_queue object| google_ad_modifications boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| google_reactive_ads_global_state object| adsbygoogle function| initiateInstaller function| forceInstaller function| useRegularLink function| $ function| jQuery function| _ string| key string| videoNameString object| _satelliteQ function| generateInfolayer object| LUX string| cxops object| cdltq function| scrollListener function| AppMeasurement_Module_ActivityMap function| AppMeasurement function| s_gi function| s_pgicq number| s_objectID number| s_giq object| s_c_il number| s_c_in object| optimizely object| s_Obj string| s_PPVid function| s_PPVevent number| s_PPVi number| s_PPVt object| s_i_cxochipde-prod string| days boolean| afterBottom object| dmc_bd5739235da857f function| k function| m number| p function| n function| q function| r function| t function| dm_conative_prebid function| defineCallback object| _EQLService object| _EQPScript object| vttjs function| WebVTT function| videojs object| f function| VideoPlayer number| LUX_t_start number| LUX_t_end object| pubsub object| priv function| dm_conative_main number| dm_conative_main_init object| dm_ccc_cmd object| GPT_jstiming object| closure_memoize_cache_ object| vmConsentCookieFinder object| consentObj string| consentStr string| consentType string| goUrl object| goScript object| head object| _EQPService object| _emqYL object| _emqConImpact string| ada_publisher object| _adrtx object| _emqAdexGif object| players object| videoScrollspy string| publisherCMSVideoID object| VM function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima function| onYouTubeIframeAPIReady object| google object| videoLayer object| customEvents string| adsc_mode object| closure_lm_64347 object| google_persistent_state_async number| google_global_correlator object| PiexuuphehaphohV string| v object| fv object| gv function| videopkgInterface object| closure_lm_399286 function| u object| z object| A function| I function| aa function| ba object| L object| Z string| hic_qos

6 Cookies

Domain/Path Name / Value
.chip.de/ Name: s_ppvl
Value: ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C37%2C37%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
.outbrain.com/ Name: obuid
Value: 09f3532a-26d6-4d99-bf5c-dd98a5dc5b35
.outbrain.com/ Name: _ofcap_DOC1
Value: AG8AZgBjAGEAcAACAAAAAHe/Tr8AZAQO+z17AGQEGr7bPABkBBr3dBYAZAQLXkq+AGQECpTMFABkBBX4G3UAZAQ0+2NlAGQEKAZ95wBkBDxGmuQAZAQSG3rbAGQEJ3ybegBkA8HQQwBkBBy+o3UAZAQdz45PAGQDatwIAGQEDup3SwBkAyXKpQBk
.outbrain.com/ Name: recs_ff40053b147595adda83d2c5b3a9b540
Value: 1B1908563891A2028152054A1300546903A2010346188A2030951662A2033780103AC2B1918080592A1604304780AC3B2026330692A2015556789A1687967680AC4B1677371640A2035538319AC5B2009026239A1506026068A1832862001AC6B2012657769A2034529220ACD1
.chip.de/ Name: s_ppv
Value: ir-53353401%2520%257C%2520move%2520mouse%2520%255Bdownloads%2520%253E%2520tuning%2520syst%255D%2C21%2C21%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
www.chip.de/ Name: GED_PLAYLIST_ACTIVITY
Value: W3sidSI6ImlseTEiLCJ0c2wiOjE1MzMyODYyNzksIm52IjoxLCJ1cHQiOjE1MzMyODYyNzYsImx0IjoxNTMzMjg2Mjc2fV0.

4 Console Messages

Source Level URL
Text
console-api log URL: https://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js(Line 4)
Message:
oil_shown_adobe
console-api info URL: https://cdn.conative.de/artifacts-v2/c2afc6bad791e1762c6f630acafcbb183f2b3ffe/adscript.min.js(Line 99)
Message:
conative received prebid request for adSlotId 0
console-api log URL: https://k.intellitxt.com/intellitxt/front.asp?ipid=5154(Line 64)
Message:
VM: ReloadGo with consentStr: <{%22opt_in%22:true%2C%22timestamp%22:1533286276664%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:0%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}>consentType: <oil_data>
console-api warning URL: https://filestorage.chip.de/videoplayer/videoplayer.88c36d866245388602ce.bundle.js(Line 13)
Message:
AdsLoader error: AdError 1012: Unable to request ads from server due to network error.

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
aax.amazon-adsystem.com
ad-js.chip.de
ad.doubleclick.net
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
adtm.chip.de
amplify.outbrain.com
amplifypixel.outbrain.com
c.amazon-adsystem.com
cdn.adrtx.net
cdn.conative.de
cdn.emetriq.de
cdn.speedcurve.com
d.df-srv.de
d3alqb8vzo7fun.cloudfront.net
de.ioam.de
dsp.adfarm1.adition.com
dyn.emetriq.de
filestorage.chip.de
hgc-cf-cache-1.svonm.com
ib.adnxs.com
images.intellitxt.com
images.outbrainimg.com
imasdk.googleapis.com
irqs.ioam.de
k.intellitxt.com
log.outbrain.com
odb.outbrain.com
p.yieldlab.net
pagead2.googlesyndication.com
partners.wfxtriggers.com
rt.chip.de
s0.2mdn.net
script.ioam.de
securepubads.g.doubleclick.net
somniture.chip.de
ssl.1.damoh.chip.de
ssl.2.damoh.chip.de
ssum-sec.casalemedia.com
tr.outbrain.com
ups.xplosion.de
vibrant.mgr.consensu.org
videoembed.chip.de
videos.chip.de
widgets.outbrain.com
www.chip.de
www.googletagservices.com
xpl.theadex.com
151.101.14.2
172.217.16.166
172.217.22.98
178.63.74.137
185.33.223.80
193.46.63.75
2.18.232.28
2.18.234.190
2.18.234.21
2001:16e0:10a:1::c1:1
2001:16e0:10a:1::c2:1
23.111.9.35
2600:9000:2047:0:1c:8c89:a300:93a1
2a00:1450:4001:806::2002
2a00:1450:4001:811::2002
2a00:1450:4001:812::2002
2a00:1450:4001:814::200a
2a00:1450:4001:81d::2006
2a02:26f0:10:482::bf0
2a02:26f0:10:498::bf0
2a02:26f0:6c00:194::1142
2a02:26f0:6c00:195::1142
2a02:26f0:6c00:198::bf0
2a02:26f0:6c00:28b::30fb
2a02:26f0:6c00:28c::bf0
2a02:26f0:6c00:2bc::bf0
31.24.80.101
34.240.31.64
46.4.39.5
46.51.178.72
52.17.80.93
52.208.127.173
52.212.57.107
52.222.147.181
52.222.149.218
52.222.150.181
52.222.150.31
52.222.150.76
52.222.150.86
52.84.122.124
52.94.216.48
54.194.160.217
63.140.40.124
64.202.112.28
74.201.198.92
85.114.144.196
85.114.159.118
88.198.8.169
89.163.159.126
91.215.100.39
91.215.103.65
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
057f3adda4aba500de10978bf47d055a9133071c6b854c7fc6c10adce4fd64c8
0ddda9839c0f03c7cc800154368af8a65eeef1ad60c70559fa784d30f21b1165
13d01a91a2551b2330cd623855b2adcda9f371d720eb02ef3adcf3a5dbffcf6a
14075887016597a1e33d48ee000f3fbf908748a56f6eb3347f29155ba481322e
15d6f954a3433a3ca85aa6b7f6bf380c17f0c6e84917c910a6a15fb0e216c542
185eb55666c350ee6eaddd5938c1a296d22497b805b958f3a53dd73e59e09110
1bfb94c4c4ed58fa8d0c81006a568c3f4d7efc4c453c58b11115ad6cf57d8e87
1c86b047f9e6428cfbe4abc895303df8d2aad721d57136ec053476582d319226
20dd7cf689d88382b472e9738037b76453abe39258fef332ef45ca9f01433510
22dff1dde57d663f587ad3f35e403b7a0d318d583ff596130f003b5f2c33d328
26c09cdd7f9117f8a775a0705c6f3a2450852ccfb5e6da407215ca4df73a7c31
26c9c2ffd3d4ea43b62a3ac326dc386049bf49048f038e051f684dee2e4d88ca
2749e0f0c73fc0b4361c0329ea608862c87a12d860636c73e4772ec4b70b9a2c
27f63f7730a4d8a7b430e3ebce56d29b14471a6b75b432b202d80df03d6550b8
28a929860c3ba181aa072a93b54cc0fa18d6d280f36743ab70c086e6e178881b
2ac0bda221cfdc311f691f5b9fa2729efdfdb485f16e54f8089c3fc3ef50d354
2c87952cc1c23627496c7874271042bdb6af21efdf7cbf36ec4d98e6cec34d04
2d368dd87d339ba2224b7f4060b1b27e5cbd2507094b989b67883abbb842a9d9
2db28c63e026d1d3ef854b17e8190f85d1b985091d12c31377c8a25c1154abcd
2e7c3de3b7b139a02ba310ff114665caa7c9716a26b3d7afa247466ea4c9a064
300235e615aade724cc540cd8900b304b80757ab3a4c927f440cdc58ea53007b
31d2b0075f674d07fad5a3cebf45a890e6a50dcb62c69d743104236104b28ae4
323b3e828035a91dc4ebbdb9a38a2220d08404131f815649f83f2be870f40b60
33ca751ed175a163bef530ebdcdbd0a2d15997ccbcbf8d50a6f504e8ffac5a5c
355ec6061c7818c5ac4e7d1d9cb56965255a632ba0d5fb49976d8c86024cc049
3e07c92fd7aea34df1623477ad28437df7186ba8ed84a7d116bfa528a7c34f48
3fe73a53f661d46251360332a2e36c5f2c3f538981705f268f1bea1ec741c343
480f7a2020234eb7d1f5745fbc8ec7f6535905cdeddda4a8b5d63bf6466c33c5
4a0410b862577f6503362c01f94a209138923c2ad938a644d671637223787129
52713637ad2eb40dc4645f58021b0493cb0475dab0b52b4ef845f63b0b1b12fc
58d691bab385679733ace3e3897224239ec3f2550c6e747003cc6fbb8b612ca8
59eef289b63cafa1d3889e072a1cfefa5f7bf785b525eabcf3aef0002cb5533a
5b41a1725ba0086e0288e567c552813b991943eddee77c5f445ac3ec089eed08
5d7c227753d3f5ead14a740e273bc30bc5760e502bec49d2aa561871e6b9deb0
61a29f6265312b9cdf681af8cae1295b33bef2424797d92b104f66aefc8a19a5
62d79df14cd7c855ebdc917e294b9e303ddd2a0c18a598bb8dc23fed081a0b36
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f
63014e0db08db9a1ba9a35d531d3ccefa158e33f53f436142550ef0d0acd5b5f
681ab2e31f80632bba4a8d51c9722044a538f9dbb7b0c1279edb93cdce24d350
6c01cde0c8d5f459cb9e9ea2ca9215fee96ec684daa065f6764bcb6dd6908d65
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
77f724d56b3d3ceab091f94f97f25d8d20593d5414390430a56b40d3f96f1616
7882943eb93f1e84954c8a6f24c46f14698762ef22b39f32066bdbeb1976ddc3
79e49b87b9b71ee642fe7ece0e58a38c0e4d5ce6c49bba5974e134ce8bb0189c
7db88358fc27c1bd55e13e06a6439e4f564a5c5bd75843413eff22a77f391c0e
7f2744ba79d66e4987ebd29b1b349b1279cd5280506d5a66e959b0d05c063183
7f83c3c04c07bb630d6cd97a664c5d374a28568a73e1a2a2d664e5621e14974f
80c9c3839dab10dafab40e8aae1d30866f5d86cbda2c41a33495afac8e2cee5c
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8415221e077fe0cbd6b1cbe89f490ededbcbc4409fbc324c442173663717ee78
84ae89a8caae26b3a43ce8047acb4336d93491fb2858d839d8074563a85eb5ba
870e27cad33d8dc47d855e12048aad477184ca7d45b5b6812f70ffc2b34b1649
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7
8b1cbf22ff33d0baef587a0f9f3c790111b162e9e249e516253883abbd2b814b
8d364c6603a2ee60db689778be810551eba9df445f2df82b1f233ef453a2912d
8dd0057a4780f0844f9fa17c4fa9d8badc7cec776afbf39de5877f98a43149fa
8eecf0a2944ad09c2017e2351de3edd35017eb94e1f3f412e4c942701f9f0687
8f2360738f903a272fd946950bd8ad2bd3ea774424e92d9befc22170881f8998
9108f8dcd5230b0f3ca08d7304f639dad3401bf6b12ca6079b0263d244af75cf
92a1b0df334580a9784edb23c8b77fb0d9d617122cd953c4dc3c8c32b29d9f75
95d61b83d7c77c95c81335f4ac68d8e35cbd5e98fcc5c7f90342ae86b61cfa80
96462e773b00c01a79cd885a78e923ea67fe8765c6d1ba38410133b222b34c71
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a
98cab46844c5321e2681b64894ea3545cf9b80d86f41400ec60d015d57b02f06
98d89e1bea9318d58557e82e4f04f43328e5166ea4d73f664159546dc6965a61
9c3a8a4dcb7025502bbad37ed9eda1f0a4310c7f19d3effc381483f6f18095f5
9ce0815e04e67d2dde584322db795c23301b0794797fbcd84210d49bc89ad28a
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9ed3a2ae1ef227fdc6f09c78bcc9a1e590da910c1c276f96b2aaf86d6c4a952e
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a188f6df5840a642b02697830db24e8201ac8df6320fa27010db41b96c7cfbef
a1ecbaed793a1f564c49c671f2dd0ce36f858534ef6d26b55783a06b884cc506
a3e5701ef5aabd13e54a5ed8ad668346179429fe554e5dcc92cb820eb52a6d91
a6991a36268dbff95892876e313edda5f6ca116ae0c409c5ac452621d57d37ba
a6a1913cb604f6626586e00b44f3d5a9efd6929752a59b87366d5f0ca70d39e4
a821ef2e57f7a813859e0757693071df87135628c3d8f017bc499d0322afeba6
ad3daafe03155cf72bb9c088764125f96475507d91b43e3646393e932a1a1363
adb39c104018084189bf781785cfcb0ec458b3716a465201c4e53b3361e5d119
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afd78436d7aa99bb2eaa5072f1f455a7e00fdf53c5cd9c19921b14e1c6c39b5f
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e
b0149cebf2aabd5f085727f8d89a2e95b844f0a646c69027c32d3027694e2a69
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b5bea41b6c623f7c09f1bf24dcae58ebab3c0cdd90ad966bc43a45b44867e12b
b70f1eb3c591b8a0c171b8998b03b348ebb363cb5db95d8a46ee415396b45637
bbcd8c21e24392c2c8ef2c5df39578e95b2bff035be4930cbc53b996087783a6
bc06a947d6a4cbdd08226c4dca598b6f60cd805acedc16d07717b230cef1a8cc
c29b262d9c088605e70dd81c16105f94afb582fc5380da65ae27bec7cb9febe4
c7784b7909c6de814e7098757f65f87f25dec4e8163332a8debedbe2412a56b7
c927695a6166edbfb66984db84b2913dcc6da4c9af0c0072dfd3807e660cd5b6
ce5296d006c932c780d60805e93dbd0312e148b42cc60a03772a90f691d44ecd
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d2042f11d6be3b4a1c4d5cbb8c0edf0d8857a9de215c29d8e4d38ba354991966
d94cd8606122ffb52098e3fdfed7e9886e8bee5414bc7058481e1cdb56e7ce7b
dc4ebc15ba0d09ed863adb0bddf3f578bc5365aaaed89d20f879ac56bee92508
dfd9bd92ae5147930219f47fd1db6dc3de97b1287f5f453a549fc6e838abba0f
e194660bad3e94afa85d2918e88ea6e09cae3e138d1982bacaecd3329f39ae82
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e48c60faae9511bda1862d6d320a7cce59354c0ab7b9cf9177a521a6354eb71c
e4da1d289ab89639768b2685742ead0e6c31997e6b29d241cdcc4427998d1a64
e6f13e2280a360fa0643e8a439549b7ecf73fb828fba659e50a6024dac3b9270
e832be11265d7211c4d6a39727d1f1dc0deb7225138ac6bb9627df33446b8477
e8de0a9a36472bb459f1e6be7c7cddcc627051ce40a234f6de72f1ef5b49a6a4
ea76437570ff0096dc9037babcce5468a832d516ec73519ef00dbc9ac10c86a8
ec07ee3e82d47822b5d11e77405b38041d5139834294b7971007d051d6ed1a33
eea0f5e0ee839da79c5eb6fc620986856bedbc3d1d6f1e3d1204d662a6f73f1f
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f0675646f823878872beeb1f3c71a2168a06c04ceea0d44bea88945ae8a8875f
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f3115bdfa715bd4b11f6f2f8e61eab795b87b83ead55e369e84999ec8a9ef93a
f76ef21e424630805039c01630d55159929b01149ee6fa74e144d233d3ce52be