URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095...
Submission: On July 11 via manual from DE

Summary

This website contacted 40 IPs in 4 countries across 24 domains to perform 84 HTTP transactions. The main IP is 2a02:26f0:6c00:2bc::bf0, located in European Union and belongs to AKAMAI-ASN1, US. The main domain is www.chip.de.
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
4 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
3 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
14 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 54.192.47.63 16509 (AMAZON-02)
3 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
1 2 216.58.214.102 15169 (GOOGLE)
1 52.94.218.7 16509 (AMAZON-02)
1 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)
2 2a00:1450:400... 15169 (GOOGLE)
1 52.85.177.41 16509 (AMAZON-02)
4 2a02:26f0:eb:... 20940 (AKAMAI-ASN1)
1 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
2 54.230.44.74 16509 (AMAZON-02)
1 1 34.249.170.42 16509 (AMAZON-02)
2 52.17.80.93 16509 (AMAZON-02)
1 52.215.33.234 16509 (AMAZON-02)
1 216.58.214.98 15169 (GOOGLE)
1 23.111.9.35 54104 (AS-STACKPATH)
1 3 172.82.228.19 15224 (OMNITURE)
1 46.137.113.194 16509 (AMAZON-02)
1 2600:9000:200... 16509 (AMAZON-02)
5 54.230.44.222 16509 (AMAZON-02)
1 52.212.57.107 16509 (AMAZON-02)
1 85.114.144.195 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 85.114.144.107 24961 (MYLOC-AS)
1 54.77.222.97 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
1 91.215.103.64 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
2 2a02:26f0:eb:... 20940 (AKAMAI-ASN1)
1 176.9.3.108 24940 (HETZNER-AS)
2 88.198.8.169 24940 (HETZNER-AS)
84 40
Domain Requested by
10 adtm.chip.de www.chip.de
adtm.chip.de
10 www.chip.de www.chip.de
6 videos.chip.de www.chip.de
5 hgc-cf-cache-1.svonm.com filestorage.chip.de
text
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 ssl.1.damoh.chip.de text
3 omniture.chip.de 1 redirects www.chip.de
3 de.ioam.de 2 redirects www.chip.de
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
2 script.ioam.de adtm.chip.de
filestorage.chip.de
2 ad.doubleclick.net 1 redirects www.chip.de
1 s0.2mdn.net imasdk.googleapis.com
1 adstax-match.adrtx.net cdn.adrtx.net
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 partners.wfxtriggers.com a.bf-ad.net
1 dyn.emetriq.de 1 redirects
1 www.googletagservices.com a.bf-ad.net
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
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 r.chip.de www.chip.de
1 ad-js.chip.de www.chip.de
1 c.amazon-adsystem.com www.chip.de
0 dl.cdn.chip.de Failed www.chip.de
84 40
Subject Issuer Validity Valid

This page contains 5 frames:

Primary Page: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Frame ID: 6EC0D69D1A88B4D11D947EB820B1E39D
Requests: 87 HTTP requests in this frame

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

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

Frame: http://imasdk.googleapis.com/js/core/bridge3.220.0_en.html
Frame ID: 1C872C11E18E4D62596E7F33FDF61DE8
Requests: 1 HTTP requests in this frame

Frame: http://dl.cdn.chip.de/downloads/842738/fdm38inst.exe?cid=54396726&platform=chip&1531339259-1531346759-8ca131-B-76f1ecf8d500b85bb110dc9875ee3236.exe
Frame ID: 127BB2612C8042F084798B1049D22201
Requests: 1 HTTP requests in this frame

Screenshot


Detected technologies

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

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

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

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

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

Overall confidence: 100%
Detected patterns
  • env /^optimizely$/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

84
Requests

0 %
HTTPS

43 %
IPv6

24
Domains

40
Subdomains

40
IPs

4
Countries

1316 kB
Transfer

7085 kB
Size

18
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 9
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145165033;dc_trk_aid=316834979;dc_trk_cid=78556199;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1531339559 HTTP 302
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145165033;dc_pre=CLrxm7Tsl9wCFUy_dwod0lMEsg;dc_trk_aid=316834979;dc_trk_cid=78556199;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1531339559
Request Chain 21
  • http://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=000b&i2=000b23538b14256ee5b466328&ep=1558045479&vr=409&id=s9k4qs&lt=1531339560448&ev=&cs=1tp1t5&mo=0 HTTP 302
  • http://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=000b&i2=000b23538b14256ee5b466328&ep=1558045479&vr=409&id=s9k4qs&lt=1531339560448&ev=&cs=1tp1t5&mo=0&sr=71 HTTP 302
  • http://de.ioam.de/blank.gif
Request Chain 39
  • http://dyn.emetriq.de/loader/91628/default.js HTTP 302
  • http://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Request Chain 54
  • http://omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s01842950790466?AQB=1&ndh=1&pf=1&t=11%2F6%2F2018%2020%3A6%3A0%203%200&D=D%3D&fid=4B2E1005E6042E97-0A140D46E7750D68&ce=UTF-8&pageName=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&g=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D8&c1=D%3Dv7&v2=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&c3=D%3Dv15&v4=Weekday%7CWednesday%7C10%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=internet%2C%20online%20web&c8=c1_downloads_hs_getfile_v1&v8=download%20manager&c10=D%3Dv8&v15=Downloads_Updates&v16=rd2014&c18=n%2Fa&v19=stationaer&v23=embedded&v25=www.chip.de&c28=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html&v30=c1_downloads_hs_getfile_v1&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%20Die%20gr%C3%B6%C3%9Ften%20Download-S%C3%BCnden&v43=8&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Cinternet_online_amp_web%7Cdownloadmanager%7Cartikel&c50=noindex%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c58=n%2Fa&c59=n%2Fa&c60=842738&v66=D%3Dc28&v67=D%3Dc60&c70=D%3Dv70&v70=downloads&v72=no%20component%20object&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
  • http://omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s01842950790466?AQB=1&pccr=true&vidn=2DA331940531279C-40000115A00030F8&&ndh=1&pf=1&t=11%2F6%2F2018%2020%3A6%3A0%203%200&D=D%3D&fid=4B2E1005E6042E97-0A140D46E7750D68&ce=UTF-8&pageName=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&g=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D8&c1=D%3Dv7&v2=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&c3=D%3Dv15&v4=Weekday%7CWednesday%7C10%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=internet%2C%20online%20web&c8=c1_downloads_hs_getfile_v1&v8=download%20manager&c10=D%3Dv8&v15=Downloads_Updates&v16=rd2014&c18=n%2Fa&v19=stationaer&v23=embedded&v25=www.chip.de&c28=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html&v30=c1_downloads_hs_getfile_v1&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%20Die%20gr%C3%B6%C3%9Ften%20Download-S%C3%BCnden&v43=8&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Cinternet_online_amp_web%7Cdownloadmanager%7Cartikel&c50=noindex%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c58=n%2Fa&c59=n%2Fa&c60=842738&v66=D%3Dc28&v67=D%3Dc60&c70=D%3Dv70&v70=downloads&v72=no%20component%20object&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 64
  • http://d.df-srv.de/match/a.js?pid=42 HTTP 302
  • http://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=6577053329313232923
Request Chain 65
  • http://xpl.theadex.com/d/279/i/2.gif?axd_pid=22&axd_fuid=BSasBSBsESaCBibkWSf-BiUABifkBDU0WifABifABifABfrr HTTP 302
  • http://xpl.theadex.com/d/279/i/2.gif?_sc=1002017672206000199&axd_pid=22&axd_fuid=BSasBSBsESaCBibkWSf-BiUABifkBDU0WifABifABifABfrr

84 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request c1_downloads_hs_getfile_v1_16104869.html
www.chip.de/downloads/
117 KB
34 KB
Document
General
Full URL
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
4f174e98a1a9fbb4cb9773e99b07f5faf81af3059cc8be88eec0392cefdfc986

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
6EC0D69D1A88B4D11D947EB820B1E39D

Response headers

Last-Modified
Wed, 11 Jul 2018 20:05:59 GMT
Vary
Accept-Encoding
Content-Encoding
gzip
Content-Type
text/html
Content-Length
34194
Expires
Wed, 11 Jul 2018 20:06:00 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Wed, 11 Jul 2018 20:06:00 GMT
Connection
keep-alive
ads_fol_init.js
a.bf-ad.net/makabo/
33 B
377 B
Script
General
Full URL
http://a.bf-ad.net/makabo/ads_fol_init.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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.4.22.css
www.chip.de/download/assets/
343 KB
78 KB
Stylesheet
General
Full URL
http://www.chip.de/download/assets/download-v1.4.22.css
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
3cabd46479e9888c9a0f23d2450ac1593b8176311b0468127feb546e5823adbd

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Thu, 17 May 2018 08:15:32 GMT
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
public, max-age=26741927
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80024
Expires
Fri, 17 May 2019 08:24:47 GMT
speedtestwidget-v1.4.22.css
www.chip.de/download/assets/
78 KB
11 KB
Stylesheet
General
Full URL
http://www.chip.de/download/assets/speedtestwidget-v1.4.22.css
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
5561f6573bec8167d4b73eb0952116e250cce1c2e0cfd3889ddd934352783d1d

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Thu, 17 May 2018 08:15:32 GMT
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
public, max-age=26742187
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
10904
Expires
Fri, 17 May 2019 08:29:07 GMT
satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/
105 KB
31 KB
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
74dba0e1a89c34d627f31a3107e62a8f8b69a47789798b47a5ef90570c8dc324

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 14:29:53 GMT
Server
AkamaiNetStorage
ETag
"2511f14772d5856853c925717e504c3b:1531319393.163914"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=134
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
31007
Expires
Wed, 11 Jul 2018 20:08:14 GMT
amzn_ads.js
c.amazon-adsystem.com/aax2/
17 KB
6 KB
Script
General
Full URL
http://c.amazon-adsystem.com/aax2/amzn_ads.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
54.192.47.63 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-192-47-63.fra6.r.cloudfront.net
Software
Server /
Resource Hash
304277d7a57f9003694a84e0afdaf94f35f061aece3dc8cac37bf2ad87244bb3

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 19:22:06 GMT
Content-Encoding
gzip
Server
Server
Age
2633
ETag
95e59eec176cff9253d42b05d08a89aa
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 0991a4b934302d120a32dada6513dc35.cloudfront.net (CloudFront)
Cache-Control
public, max-age=86400
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5596
X-Amz-Cf-Id
P8kastLjIDJ17VoYDO7xXLWQT3-HDNPeYy5pHIQ0EiRRk_IfClZBCA==
9232.min.js
ad-js.chip.de/js/chip/
141 KB
39 KB
Script
General
Full URL
http://ad-js.chip.de/js/chip/9232.min.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
9691f3a40c39e598978142c51126ea22f3b7667635c2644e79b662914d270560

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 20 Jun 2018 09:39:40 GMT
Server
Apache
ETag
"e6d060e9420ff4e5e09d8cd03a86154f:1529487581"
Vary
Accept-Encoding
Content-Type
text/javascript; charset=utf-8
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
40066
bootstrap.db4b874c686da775482d.bundle.js
filestorage.chip.de/videoplayer/
31 KB
12 KB
Script
General
Full URL
https://filestorage.chip.de/videoplayer/bootstrap.db4b874c686da775482d.bundle.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:192::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
4ac5a62a981d4ab42f91f176710b8c77c7f26bdb3c9dc115466481308aebd89f

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Jul 2018 09:46:33 GMT
Server
Apache
ETag
"dab2fa4fe1d43c5815c67d35c77d2b94:1530524793"
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
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
*
Content-Length
11439
dl-getfile-kaspersky.gif
www.chip.de/c1_i/
2 KB
2 KB
Image
General
Full URL
http://www.chip.de/c1_i/dl-getfile-kaspersky.gif
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
ac9f2e62bf488a3f18038b7ba3526884daf4e231bc5d332f4b316934e9c16f4e

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Mon, 21 Mar 2011 08:00:51 GMT
Vary
Accept-Encoding
Content-Type
image/gif
Cache-Control
public, max-age=18187055
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2093
Expires
Thu, 07 Feb 2019 08:03:35 GMT
B10860713.145165033;dc_pre=CLrxm7Tsl9wCFUy_dwod0lMEsg;dc_trk_aid=316834979;dc_trk_cid=78556199;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.145165033;dc_trk_aid=316834979;dc_trk_cid=78556199;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1531339559
  • https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145165033;dc_pre=CLrxm7Tsl9wCFUy_dwod0lMEsg;dc_trk_aid=316834979;dc_trk_cid=78556199;ord=[timestamp];dc_lat=;dc_rdid=;tag_for...
42 B
317 B
Image
General
Full URL
https://ad.doubleclick.net/ddm/trackimp/N408002.112081CHIP.DE/B10860713.145165033;dc_pre=CLrxm7Tsl9wCFUy_dwod0lMEsg;dc_trk_aid=316834979;dc_trk_cid=78556199;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1531339559
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
SPDY
Server
216.58.214.102 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s05-in-f6.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:06:00 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="43,42,41,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
Wed, 11 Jul 2018 20:06:00 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.145165033;dc_pre=CLrxm7Tsl9wCFUy_dwod0lMEsg;dc_trk_aid=316834979;dc_trk_cid=78556199;ord=[timestamp];dc_lat=;dc_rdid=;tag_for_child_directed_treatment=?1531339559
cache-control
no-cache, must-revalidate
follow-only-when-prerender-shown
1
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="43,42,41,39,35"
content-length
0
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT
pic.gif
r.chip.de/images/
35 B
348 B
Image
General
Full URL
http://r.chip.de/images/pic.gif?m=c1&nc=0&sep=%2C&c=16104869&b=842738&tce=1&l=3546&tid=38922&tp=9223%2C9232%2C38906&tn=Download%20Manager&tpn=Home%252CDownloads%252CInternet%2C%20Online%20%26%20Web&tc=9223%2C9232%2C38906%2C38922&tit=Free%20Download%20Manager&url=http%3A%2F%2Fwww.chip.deF%2downloadsF%2c1_downloads_hs_getfile_v1_16104869.html&cs=1
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
r.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:06:00 GMT
Last-Modified
Tue, 02 Mar 2004 15:46:04 GMT
ETag
"23-3d4a7dd168700"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
35
Expires
Wed, 11 Jul 2018 20:06:00 GMT
dl_countdown-v1.4.22.js
www.chip.de/download/assets//
2 KB
921 B
Script
General
Full URL
http://www.chip.de/download/assets//dl_countdown-v1.4.22.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
de061a6515a35f573d3694f7b34f81f511f51e145b89919cc421ca088e49bd55

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Thu, 17 May 2018 08:15:32 GMT
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
public, max-age=26742087
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
586
Expires
Fri, 17 May 2019 08:27:27 GMT
hook-v1.4.22.js
www.chip.de/download/assets/
291 KB
98 KB
Script
General
Full URL
http://www.chip.de/download/assets/hook-v1.4.22.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
6f43ff79d7db2ff36aa5506ec682550d6442a0aac4d7babadac4aefe81afc1bf

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Thu, 17 May 2018 08:15:32 GMT
Vary
Accept-Encoding
Content-Type
application/javascript
Cache-Control
public, max-age=26742047
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
100078
Expires
Fri, 17 May 2019 08:26:47 GMT
satellite-5b192bd364746d5acf000a29.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
816 B
1 KB
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5b192bd364746d5acf000a29.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
8eecf0a2944ad09c2017e2351de3edd35017eb94e1f3f412e4c942701f9f0687

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Last-Modified
Mon, 09 Jul 2018 09:29:34 GMT
Server
AkamaiNetStorage
ETag
"305c5b6044d799c22ddef1af3f8e191f:1531128574.350647"
Content-Type
application/x-javascript
Cache-Control
max-age=235
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
816
Expires
Wed, 11 Jul 2018 20:09:55 GMT
satellite-57c58fcc64746d7a93007e3e.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
1 KB
951 B
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57c58fcc64746d7a93007e3e.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
63014e0db08db9a1ba9a35d531d3ccefa158e33f53f436142550ef0d0acd5b5f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 06:32:01 GMT
Server
AkamaiNetStorage
ETag
"96e982946b194bcaffc7b790b9076db7:1531290721.52598"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=105
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
518
Expires
Wed, 11 Jul 2018 20:07:45 GMT
satellite-5a0ef85764746d0bbd0091aa.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
97 B
541 B
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef85764746d0bbd0091aa.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
e832be11265d7211c4d6a39727d1f1dc0deb7225138ac6bb9627df33446b8477

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 14:30:05 GMT
Server
AkamaiNetStorage
ETag
"18529802fc6a5d1e92de7afe937f15f1:1531319405.300749"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=235
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
107
Expires
Wed, 11 Jul 2018 20:09:55 GMT
bid
aax.amazon-adsystem.com/e/dtb/
32 B
242 B
Script
General
Full URL
http://aax.amazon-adsystem.com/e/dtb/bid?src=3128&u=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&cb=910127&gdprl=%7B%22status%22%3A%22cmp-in-flight%22%7D
Requested by
Host: c.amazon-adsystem.com
URL: http://c.amazon-adsystem.com/aax2/amzn_ads.js
Protocol
HTTP/1.1
Server
52.94.218.7 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Server /
Resource Hash
997b4337cdc0a396bb1b924e865a16fa877fad1f69a72149ddc64073f35d6081

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/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
Wed, 11 Jul 2018 20:06:00 GMT
Server
Server
Connection
Keep-Alive
Keep-Alive
timeout=2, max=19
Content-Length
32
Vary
User-Agent
Content-Type
text/javascript;charset=UTF-8
satellite-5a0ef80d64746d0bc600a756.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
125 B
606 B
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0ef80d64746d0bc600a756.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
681ab2e31f80632bba4a8d51c9722044a538f9dbb7b0c1279edb93cdce24d350

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 14:30:06 GMT
Server
AkamaiNetStorage
ETag
"ec842dcaa4f0f12ac396afbeb19a4f8f:1531319406.303505"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=250
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
* * *
Content-Length
124
Expires
Wed, 11 Jul 2018 20:10:10 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: http://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 000b
Resource Hash
5967eecd6a5178f8afc63fdfdfc6ff0d57196bfeedbafd1615bf53c66dcacf57

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 20:06:00 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 000b
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
Wed, 11 Jul 2018 22:06:00 GMT
hub.html
a.bf-tools.net/cmp/ Frame 2C47
0
0
Document
General
Full URL
http://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
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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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
6EC0D69D1A88B4D11D947EB820B1E39D
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b

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
Wed, 11 Jul 2018 20:06:00 GMT
Content-Length
5299
Connection
keep-alive
identitystatus
irqs.ioam.de/
25 B
300 B
XHR
General
Full URL
http://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.7660322691591122
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js?m=1
Protocol
HTTP/1.1
Server
193.46.63.75 Bonn, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Wed, 11 Jul 2018 20:06:00 GMT
Server
nginx
Vary
Origin
Content-Type
application/vnd.api+json
Access-Control-Allow-Origin
http://www.chip.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Transfer-Encoding
chunked
blank.gif
de.ioam.de/
Redirect Chain
  • http://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=000b&i2=000b23538b14256ee5b466328&ep=1558045479&vr=409&id=s9k4qs&lt=153...
  • http://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=000b&i2=000b23538b14256ee5b466328&ep=1558045479&vr=409&id=s9k4qs&lt=153...
  • http://de.ioam.de/blank.gif
43 B
651 B
Image
General
Full URL
http://de.ioam.de/blank.gif
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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
Thu, 12 Jul 2018 20:06:00 GMT

Redirect headers

Date
Wed, 11 Jul 2018 20:06:00 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.04.6 0027
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
Wed, 11 Jul 2018 20:06:00 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
Tue, 11 Jul 2017 20:06:00 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:194::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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
de.js
a.bf-tools.net/de/
3 KB
2 KB
Script
General
Full URL
http://a.bf-tools.net/de/de.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:195::1142 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
27f63f7730a4d8a7b430e3ebce56d29b14471a6b75b432b202d80df03d6550b8

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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/
166 KB
44 KB
Script
General
Full URL
http://a.bf-ad.net/pubjs/chip/adengine.js
Requested by
Host: ad-js.chip.de
URL: http://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
6ddeaf79d1911c57d0bcb260fda9f7552f4ffa7cdc77e706ef45a5132178b2f5

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 10:09:16 GMT
Server
Apache
ETag
"bf697ec9684b5478a32da43d095074df:1531303759"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
44367
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
73 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: ad-js.chip.de
URL: http://ad-js.chip.de/js/chip/9232.min.js
Protocol
SPDY
Server
2a00:1450:4001:80b::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
92720b5b049592c4b1f1fe1f64762c10a2eb863df4ad4d934ea1826807b43cc6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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="43,42,41,39,35",quic=":443"; ma=2592000; v="43,42,41,39,35"
content-length
27347
x-xss-protection
1; mode=block
server
cafe
etag
15073865808609550342
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Wed, 11 Jul 2018 20:06:00 GMT
truncated
/
35 KB
0
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ed5acbd32a88f9959e4fa56ccc47da61ce54c15299422c1204518222ea35db6e

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
http://www.chip.de/download/assets/download-v1.4.22.css
Origin
http://www.chip.de

Response headers

Access-Control-Allow-Origin
*
Content-Type
application/x-font-woff;charset=utf-8
c8c3489e-f329-40e8-bcfc-1f852e512b01-1.0.js
d3alqb8vzo7fun.cloudfront.net/
357 KB
58 KB
Script
General
Full URL
http://d3alqb8vzo7fun.cloudfront.net/c8c3489e-f329-40e8-bcfc-1f852e512b01-1.0.js
Requested by
Host: a.bf-tools.net
URL: http://a.bf-tools.net/de/de.js
Protocol
HTTP/1.1
Server
52.85.177.41 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-85-177-41.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
ec13ba8196cd9c9400ad864553c2578fbd47eda5d52cb59e3760a769babbafeb

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 15:24:28 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 15:23:24 GMT
Server
AmazonS3
Age
93
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/x-javascript
Via
1.1 f2cc6dbe7150e50a6bc010a2d6868e5f.cloudfront.net (CloudFront)
Cache-Control
max-age=300
Transfer-Encoding
chunked
Connection
keep-alive
X-Amz-Cf-Id
-sHuEjslOIsb9j2Ygzn8tLRMxuqUUYsbXspLpkRmD6BlfVfufuQSkw==
main.db4b874c686da775482d.css
filestorage.chip.de/videoplayer/stylesheets/
70 KB
19 KB
Stylesheet
General
Full URL
https://filestorage.chip.de/videoplayer/stylesheets/main.db4b874c686da775482d.css
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/bootstrap.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:192::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
3830c3036c21cb4580425ba8522a8144d6d58e7382cd85a02198c219ccb29250

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Jul 2018 09:46:36 GMT
Server
Apache
ETag
"28ef464db768087b612adf339aec7364:1530524796"
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
Connection
keep-alive
Accept-Ranges
bytes
Access-Control-Allow-Headers
*
Content-Length
19401
18
videos.chip.de/p/1741931/thumbnail/entry_id/1_hiudllfs/width/640/height/360/
171 KB
171 KB
Image
General
Full URL
https://videos.chip.de/p/1741931/thumbnail/entry_id/1_hiudllfs/width/640/height/360/18
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:eb:193::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
18cde97d17724751dd2b50466e464b5c4a2fd608c30fd11969830956b3383f75

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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,d9cff2b4dbc787bf418d9d5463bf4155
X-Me
ny-front-thumb2
Date
Wed, 11 Jul 2018 20:06:00 GMT
X-Vod-Session
1066175728
Connection
keep-alive
Content-Length
174972
Pragma
Last-Modified
Fri, 11 May 2018 13:12:14 GMT
Server
nginx
Vary
Accept-Encoding
X-Vod-Me
pa-front-vod1
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=2248
Accept-Ranges
bytes
X-Kaltura-Session
2102009315
Expires
Wed, 11 Jul 2018 20:43:28 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
videoplayer.db4b874c686da775482d.bundle.js
filestorage.chip.de/videoplayer/
424 KB
115 KB
Script
General
Full URL
https://filestorage.chip.de/videoplayer/videoplayer.db4b874c686da775482d.bundle.js
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/bootstrap.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:192::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
7a224acf8e699b4d3a541efa56217266b179d647b49c09d08cd4d47cc64db713

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Jul 2018 09:46:35 GMT
Server
Apache
ETag
"1e02f17141cd0d16ff8b01fb030bef52:1530524795"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET,POST
Content-Type
application/x-javascript
Access-Control-Allow-Origin
*
Access-Control-Max-Age
86400
Transfer-Encoding
chunked
Connection
keep-alive, Transfer-Encoding
Accept-Ranges
bytes
Access-Control-Allow-Headers
*
Access-Control-Allow-Credentials
false
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:80b::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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:06:00 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="43,42,41,39,35",quic=":443"; ma=2592000; v="43,42,41,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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:06:00 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
gpt.js
www.googletagservices.com/tag/js/
20 KB
8 KB
Script
General
Full URL
http://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: a.bf-ad.net
URL: http://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
349a658bfe8ec9c807d02d46bddd2a2a6b4e36a5c2705e3e8706db2fac2bb18c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Server
sffe
ETag
"5 / 567 of 1000 / last-modified: 1531238519"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
private, max-age=900, stale-while-revalidate=3600
Timing-Allow-Origin
*
Content-Length
7843
X-XSS-Protection
1; mode=block
Expires
Wed, 11 Jul 2018 20:06:00 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: http://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:292::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
a6a1913cb604f6626586e00b44f3d5a9efd6929752a59b87366d5f0ca70d39e4

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Thu, 05 Jul 2018 09:51:25 GMT
Server
Apache
ETag
"13446150d29adab64935a3c98d18ac19:1530784286"
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: http://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:292::30fb , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
31b96de7507628a225f4a7aaf348b4d9e4d10a73d8e00be9a98586557fe25505

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Thu, 05 Jul 2018 09:51:24 GMT
Server
Apache
ETag
"9fe072d5c8e54cf614e854d3c1a98285:1530784286"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1958
config.js
cdn.conative.de/serve/domain/chip_de/
61 KB
8 KB
Script
General
Full URL
http://cdn.conative.de/serve/domain/chip_de/config.js
Requested by
Host: a.bf-ad.net
URL: http://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
54.230.44.74 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-44-74.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
0051671131359ffdcaa608831243bf98643cfd19d30933e878fd62f300833ba9

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 14:04:08 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 13:53:57 GMT
Server
AmazonS3
Age
113
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 6fd049110ebc3ac6deddab8b0bf5d686.cloudfront.net (CloudFront)
Cache-Control
max-age=1800
Transfer-Encoding
chunked
x-amz-tagging-count
1
Connection
keep-alive
X-Amz-Cf-Id
ugwIrFqdlXXFkoDVs8MpE10EN8K-H83ole3XSyih81MNu2mdUgmHdQ==
default.js
ups.xplosion.de/loader/91628/
Redirect Chain
  • http://dyn.emetriq.de/loader/91628/default.js
  • http://ups.xplosion.de/loader/91628/default.js?xplrdir=1
2 KB
2 KB
Script
General
Full URL
http://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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
http://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Date
Wed, 11 Jul 2018 20:06:00 GMT
Server
Apache-Coyote/1.1
Connection
keep-alive
Content-Length
0
/
partners.wfxtriggers.com/json/
227 B
381 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: http://a.bf-ad.net/pubjs/chip/adengine.js
Protocol
HTTP/1.1
Server
52.215.33.234 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-215-33-234.eu-west-1.compute.amazonaws.com
Software
openresty/1.7.7.1 /
Resource Hash
e0372503b783afd44c634d8aa10fb5616a05494e3402306cc7eb8f64aa6325b6

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:01 GMT
Server
openresty/1.7.7.1
Connection
keep-alive
Content-Length
227
Content-Type
text/plain
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
892945a64051bc33.jpg
www.chip.de/ii/6/0/3/5/9/7/7/
3 KB
3 KB
Image
General
Full URL
http://www.chip.de/ii/6/0/3/5/9/7/7/892945a64051bc33.jpg
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
897146e630e07325a5205de579fa04b4f650b148bab1740694f8fc28e422d14b

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1531425960447; oil_data={%22opt_in%22:true%2C%22timestamp%22:1531339560521%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
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 23 Sep 2015 11:19:48 GMT
Vary
Accept-Encoding
Content-Type
image/jpeg
Cache-Control
public, max-age=18171795
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2773
Expires
Thu, 07 Feb 2019 03:49:15 GMT
jdownloader-5360d3e7f54996f0.jpg
www.chip.de/ii/5/2/9/3/3/9/3/
5 KB
5 KB
Image
General
Full URL
http://www.chip.de/ii/5/2/9/3/3/9/3/jdownloader-5360d3e7f54996f0.jpg
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:2bc::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
76be94d03db6a2d007e27e284126aa139ec510be48d7e090bc4120c270d9fc1c

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1531425960447; oil_data={%22opt_in%22:true%2C%22timestamp%22:1531339560521%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
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Apr 2012 11:38:24 GMT
Vary
Accept-Encoding
Content-Type
image/jpeg
Cache-Control
public, max-age=18167751
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4892
Expires
Thu, 07 Feb 2019 02:41:51 GMT
451c5e82063495d3.jpg
www.chip.de/ii/8/7/7/5/2/8/0/
4 KB
4 KB
Image
General
Full URL
http://www.chip.de/ii/8/7/7/5/2/8/0/451c5e82063495d3.jpg
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
cb424a134d34f0055e4a9be86847cc0d6dec3aab0498b8f276d5ee68b737d7c3

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1531425960447; oil_data={%22opt_in%22:true%2C%22timestamp%22:1531339560521%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
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Tue, 22 Dec 2015 16:35:45 GMT
Vary
Accept-Encoding
Content-Type
image/jpeg
Cache-Control
public, max-age=18207307
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3647
Expires
Thu, 07 Feb 2019 13:41:07 GMT
videodownloadhelper-af49e2495a2805c2.jpg
www.chip.de/ii/3/1/0/7/1/0/0/
3 KB
3 KB
Image
General
Full URL
http://www.chip.de/ii/3/1/0/7/1/0/0/videodownloadhelper-af49e2495a2805c2.jpg
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:28c::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
/
Resource Hash
4498abc4b0327f866180100b14c14d0644ef12db41852db4be4bcf5ac54d732a

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Cookie
AB_SegmentNew=sourcepoint; AB_countNew=first; POPUPCHECK=1531425960447; oil_data={%22opt_in%22:true%2C%22timestamp%22:1531339560521%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
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Apr 2012 15:09:37 GMT
Vary
Accept-Encoding
Content-Type
image/jpeg
Cache-Control
public, max-age=18182862
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2679
Expires
Thu, 07 Feb 2019 06:53:42 GMT
satellite-5a0c20e064746d476b0006bf.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
431 B
817 B
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a0c20e064746d476b0006bf.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
9c3a8a4dcb7025502bbad37ed9eda1f0a4310c7f19d3effc381483f6f18095f5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Last-Modified
Wed, 11 Jul 2018 14:29:59 GMT
Server
AkamaiNetStorage
ETag
"0aaab06ed50a5b4adf1f46cee6a37b03:1531319399.563044"
Content-Type
application/x-javascript
Cache-Control
max-age=99
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
431
Expires
Wed, 11 Jul 2018 20:07:39 GMT
satellite-5a1fc54664746d108e0025fa.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
1 KB
1010 B
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-5a1fc54664746d108e0025fa.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
9ce0815e04e67d2dde584322db795c23301b0794797fbcd84210d49bc89ad28a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 20 Jun 2018 07:07:39 GMT
Server
AkamaiNetStorage
ETag
"1bbd204641533bb6cd622e5d702269da:1529478459.930813"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=8
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
578
Expires
Wed, 11 Jul 2018 20:06:08 GMT
satellite-57ad808c64746d3e8d000ef0.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
12 KB
4 KB
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-57ad808c64746d3e8d000ef0.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
2ac0bda221cfdc311f691f5b9fa2729efdfdb485f16e54f8089c3fc3ef50d354

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 14:29:57 GMT
Server
AkamaiNetStorage
ETag
"5e1418055bacf3067ad47441e9bbbf43:1531319397.242524"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=142
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
3573
Expires
Wed, 11 Jul 2018 20:08:22 GMT
s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/
35 KB
13 KB
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/s-code-contents-3fc54c0d5404f54efff3418f68e36a29132e0b15.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
13d01a91a2551b2330cd623855b2adcda9f371d720eb02ef3adcf3a5dbffcf6a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 06:31:52 GMT
Server
AkamaiNetStorage
ETag
"02ca1a570d3d888e83ac86b30c9aeb8d:1531290712.806764"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=181
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
13386
Expires
Wed, 11 Jul 2018 20:09:01 GMT
satellite-58b3dec264746d7415009f7b.js
adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/
97 B
549 B
Script
General
Full URL
http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/scripts/satellite-58b3dec264746d7415009f7b.js
Requested by
Host: adtm.chip.de
URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AkamaiNetStorage /
Resource Hash
96462e773b00c01a79cd885a78e923ea67fe8765c6d1ba38410133b222b34c71

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
adtm.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 14:30:01 GMT
Server
AkamaiNetStorage
ETag
"f9e6fb38072864f7c23cb0a6b27cc98f:1531319401.930254"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=270
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*
Content-Length
115
Expires
Wed, 11 Jul 2018 20:10:30 GMT
adscript.min.js
cdn.conative.de/artifacts-v2/ab14227678c3837a0815482cc7555951861a5811/
227 KB
64 KB
Script
General
Full URL
http://cdn.conative.de/artifacts-v2/ab14227678c3837a0815482cc7555951861a5811/adscript.min.js
Requested by
Host: cdn.conative.de
URL: http://cdn.conative.de/serve/domain/chip_de/config.js
Protocol
HTTP/1.1
Server
54.230.44.74 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-44-74.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b54ab16ff88abc1bc88e4da361475774d508f7be32a7ae8b3e7acdf34ad7445e

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 13:34:27 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 13:28:25 GMT
Server
AmazonS3
Age
23494
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
Content-Type
application/javascript
Via
1.1 6fd049110ebc3ac6deddab8b0bf5d686.cloudfront.net (CloudFront)
Cache-Control
public,max-age=31536000
Transfer-Encoding
chunked
Connection
keep-alive
X-Amz-Cf-Id
Oe6qP0ZyUQgS0gk7fv-HERwRmrO8E9SO7R2jewMxoOD6DeMpRWDZHw==
pubads_impl_231.js
securepubads.g.doubleclick.net/gpt/
178 KB
61 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_231.js
Requested by
Host: www.googletagservices.com
URL: http://www.googletagservices.com/tag/js/gpt.js
Protocol
SPDY
Server
216.58.214.98 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra16s05-in-f98.1e100.net
Software
sffe /
Resource Hash
1c80619aa99b4bce0b57edaeaf2bae35ad0e1929096a51d0ced52df4dfa68e3d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 06 Jul 2018 21:28:59 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="43,42,41,39,35"
content-length
62603
x-xss-protection
1; mode=block
expires
Wed, 11 Jul 2018 20:06:00 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: http://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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 GMT
content-encoding
gzip
last-modified
Fri, 06 Jul 2018 00:13:50 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
Fri, 13 Jul 2018 00:13:50 GMT
Cookie set s01842950790466
omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/
Redirect Chain
  • http://omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s01842950790466?AQB=1&ndh=1&pf=1&t=11%2F6%2F2018%2020%3A6%3A0%203%200&D=D%3D&fid=4B2E1005E6042E97-0A140D46E7750D68&ce=UTF-8&pageName=ir-8...
  • http://omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s01842950790466?AQB=1&pccr=true&vidn=2DA331940531279C-40000115A00030F8&&ndh=1&pf=1&t=11%2F6%2F2018%2020%3A6%3A0%203%200&D=D%3D&fid=4B2E10...
43 B
718 B
Image
General
Full URL
http://omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s01842950790466?AQB=1&pccr=true&vidn=2DA331940531279C-40000115A00030F8&&ndh=1&pf=1&t=11%2F6%2F2018%2020%3A6%3A0%203%200&D=D%3D&fid=4B2E1005E6042E97-0A140D46E7750D68&ce=UTF-8&pageName=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&g=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D8&c1=D%3Dv7&v2=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&c3=D%3Dv15&v4=Weekday%7CWednesday%7C10%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=internet%2C%20online%20web&c8=c1_downloads_hs_getfile_v1&v8=download%20manager&c10=D%3Dv8&v15=Downloads_Updates&v16=rd2014&c18=n%2Fa&v19=stationaer&v23=embedded&v25=www.chip.de&c28=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html&v30=c1_downloads_hs_getfile_v1&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%20Die%20gr%C3%B6%C3%9Ften%20Download-S%C3%BCnden&v43=8&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Cinternet_online_amp_web%7Cdownloadmanager%7Cartikel&c50=noindex%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c58=n%2Fa&c59=n%2Fa&c60=842738&v66=D%3Dc28&v67=D%3Dc60&c70=D%3Dv70&v70=downloads&v72=no%20component%20object&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: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
172.82.228.19 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
*.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
omniture.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Cookie
s_fid=4B2E1005E6042E97-0A140D46E7750D68; gpv=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D; s_vnum=1562875560721%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-842738%2520%257C%2520free%2520download%2520manager%2520%255Bdownloads%2520%253E%2520internet%252C%2520o%255D%2C73%2C73%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1531339560733; CXOid=0.6416991872606892; s_vi=[CS]v1|2DA331940531279C-40000115A00030F8[CE]
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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
Thu, 12 Jul 2018 20:06:00 GMT
Server
Omniture DC/2.0.0
xserver
www173
ETag
"3288526664722612224-5325226276779208960"
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|2DA331940531279C-40000115A00030F8[CE]; Expires=Fri, 10 Jul 2020 20:06:00 GMT; Domain=chip.de; Path=/
Expires
Tue, 10 Jul 2018 20:06:00 GMT

Redirect headers

Date
Wed, 11 Jul 2018 20:06:00 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
Thu, 12 Jul 2018 20:06:00 GMT
Server
Omniture DC/2.0.0
xserver
www173
Location
http://omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s01842950790466?AQB=1&pccr=true&vidn=2DA331940531279C-40000115A00030F8&&ndh=1&pf=1&t=11%2F6%2F2018%2020%3A6%3A0%203%200&D=D%3D&fid=4B2E1005E6042E97-0A140D46E7750D68&ce=UTF-8&pageName=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&g=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&ch=downloads&server=www.chip.de&events=event129%2Cevent154%3D8&c1=D%3Dv7&v2=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&c3=D%3Dv15&v4=Weekday%7CWednesday%7C10%3A00PM&c5=D%3Dv4&v5=1&v6=downloads&c7=D%3Dv16&v7=internet%2C%20online%20web&c8=c1_downloads_hs_getfile_v1&v8=download%20manager&c10=D%3Dv8&v15=Downloads_Updates&v16=rd2014&c18=n%2Fa&v19=stationaer&v23=embedded&v25=www.chip.de&c28=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html&v30=c1_downloads_hs_getfile_v1&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%20Die%20gr%C3%B6%C3%9Ften%20Download-S%C3%BCnden&v43=8&c44=dtm%20CHIP%20Master&c46=D%3Dv46&v46=chip_digital%7Cdownloads%7Cinternet_online_amp_web%7Cdownloadmanager%7Cartikel&c50=noindex%2C%20follow&c51=D%3Dv19&c52=downloads&c54=no&c58=n%2Fa&c59=n%2Fa&c60=842738&v66=D%3Dc28&v67=D%3Dc60&c70=D%3Dv70&v70=downloads&v72=no%20component%20object&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|2DA331940531279C-40000115A00030F8[CE]; Expires=Fri, 10 Jul 2020 20:06:00 GMT; Domain=chip.de; Path=/
Expires
Tue, 10 Jul 2018 20:06:00 GMT
collect
rt.chip.de/
35 B
391 B
Image
General
Full URL
https://rt.chip.de/collect?t=live.track&cachebust=jjhk1b8m&rnd=eb123926-6619-4cd4-9f70-fa99e13b2350&ran=eb123926-6619-4cd4-9f70-fa99e13b2350&14=7350&uid=0.6416991872606892&ref=&url=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&tit=free%20download%20manager&id=842738&bart=Downloads_Updates&layout=c1_downloads_hs_getfile_v1&ch=downloads&sch=internet%2C%20online%20web&ssch=download%20manager&ivw=downloads&mob=stationaer&aut=michael%20humpa&can=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
46.137.113.194 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-46-137-113-194.eu-west-1.compute.amazonaws.com
Software
nginx/1.7.9 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:06:00 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
p.min.js
cdn.emetriq.de/adp/profiling/0.1.13/
4 KB
2 KB
Script
General
Full URL
http://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Requested by
Host: ups.xplosion.de
URL: http://ups.xplosion.de/loader/91628/default.js?xplrdir=1
Protocol
HTTP/1.1
Server
2600:9000:2006:f600:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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:32:54 GMT
Content-Encoding
gzip
Last-Modified
Tue, 11 Apr 2017 11:21:30 GMT
Server
AmazonS3
Age
3573187
Vary
Accept-Encoding
X-Cache
Hit from cloudfront
x-amz-version-id
FiFeAFfpoMZPPyU16IPZd0oUAvReA_Mm
Via
1.1 7e0707e0f48f4f9539869f4f24aa67e4.cloudfront.net (CloudFront)
Cache-Control
max-age=31536000, no-transform, public
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
X-Amz-Cf-Id
EAcMxG8HV_5ZDllVSo7z_5KvZbQ4K_m1YeruHYUJqRomB7NtE2bzqQ==
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.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
54.230.44.222 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-44-222.fra6.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Wed, 11 Jul 2018 13:53:28 GMT
Via
1.1 6fd049110ebc3ac6deddab8b0bf5d686.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
10
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
53
Last-Modified
Wed, 11 Jul 2018 13:52:59 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
Qyex2OyNzRtUERmy7fcISR0GMJ5rQndPR9hVIncJKQHIJPdr2cLHPA==
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.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Wed, 11 Jul 2018 20:06:00 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Jul 2018 09:46:37 GMT
Server
Apache
ETag
"bdd1fe062d58c3e9d9216922f317755d:1530524797"
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.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
54.230.44.222 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-44-222.fra6.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Mon, 02 Jul 2018 09:53:17 GMT
Via
1.1 6fd049110ebc3ac6deddab8b0bf5d686.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
20
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
uvE3LvgWhWiU75HvSjsGRTQy2Swf5vIHY6YuWEGQnUEdV58dWz4wpQ==
Expires
0
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
http://ups.xplosion.de/data?title=Free%20Download%20Manager%20-%20Download%20-%20CHIP&hostSiteUrl=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&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&_=602270967299
Requested by
Host: cdn.emetriq.de
URL: http://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
4d643ab234c70d43e4bb9887222ad5caf63460ddbd41e0aeb5479f33a01213b8

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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
1492
Cookie set s05558847781199
omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/
43 B
718 B
Image
General
Full URL
http://omniture.chip.de/b/ss/cxochipde-prod/1/JS-2.7.0-D7QN/s05558847781199?AQB=1&ndh=1&pf=1&t=11%2F6%2F2018%2020%3A6%3A0%203%200&D=D%3D&fid=4B2E1005E6042E97-0A140D46E7750D68&ce=UTF-8&pageName=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D&g=http%3A%2F%2Fwww.chip.de%2Fdownloads%2Fc1_downloads_hs_getfile_v1_16104869.html%3Ft%3D1531339545%26v%3D3600%26s%3D9972517a3d42e3a8d71b095907f5a12b&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: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
172.82.228.19 Lehi, United States, ASN15224 (OMNITURE - Adobe Systems Inc., US),
Reverse DNS
*.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
omniture.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Cookie
s_fid=4B2E1005E6042E97-0A140D46E7750D68; gpv=ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D; s_vnum=1562875560721%26vn%3D1; s_invisit=true; s_ppvl=%5B%5BB%5D%5D; s_ppv=ir-842738%2520%257C%2520free%2520download%2520manager%2520%255Bdownloads%2520%253E%2520internet%252C%2520o%255D%2C73%2C73%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP; s_cc=true; s_lastvisit=1531339560733; CXOid=0.6416991872606892; s_vi=[CS]v1|2DA331940531279C-40000115A00030F8[CE]
Connection
keep-alive
Cache-Control
no-cache
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:00 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
Thu, 12 Jul 2018 20:06:00 GMT
Server
Omniture DC/2.0.0
xserver
www173
ETag
"3288526664722612224-5325367014267564292"
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|2DA331940531279C-40000115A00030F8[CE]; Expires=Fri, 10 Jul 2020 20:06:00 GMT; Domain=chip.de; Path=/
Expires
Tue, 10 Jul 2018 20:06:00 GMT
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
http://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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.1 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 07:11:10 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 07:10:47 GMT
Server
akka-http/10.1.1
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
http://p.yieldlab.net/m?dm_id=23666&ext_id=BSasBSBsESaCBibkWSf-BiUABifkBDU0WifABifABifABfrr&ddata_seg=e0
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
85.114.144.195 , 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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:06:00 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
Tue, 10 Jul 2018 20:06:00 GMT
a.js
d.df-srv.de/match/
Redirect Chain
  • http://d.df-srv.de/match/a.js?pid=42
  • http://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=6577053329313232923
3 B
466 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6577053329313232923
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2001:16e0:10a:1::c2:1 , Germany, ASN12611 (RKOM R-KOM Regensburger Telekommunikations GmbH & Co. KG, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:05:51 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=6577053329313232923
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Connection
close
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
2.gif
xpl.theadex.com/d/279/i/
Redirect Chain
  • http://xpl.theadex.com/d/279/i/2.gif?axd_pid=22&axd_fuid=BSasBSBsESaCBibkWSf-BiUABifkBDU0WifABifABifABfrr
  • http://xpl.theadex.com/d/279/i/2.gif?_sc=1002017672206000199&axd_pid=22&axd_fuid=BSasBSBsESaCBibkWSf-BiUABifkBDU0WifABifABifABfrr
43 B
717 B
Image
General
Full URL
http://xpl.theadex.com/d/279/i/2.gif?_sc=1002017672206000199&axd_pid=22&axd_fuid=BSasBSBsESaCBibkWSf-BiUABifkBDU0WifABifABifABfrr
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
85.114.144.107 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
Wed, 11 Jul 2018 20:06:00 GMT
Last-Modified
Wed, 11 Jul 2018 20:06:00 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
Wed, 11 Jul 2018 20:06:00 GMT
Server
nginx
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"
Location
http://xpl.theadex.com/d/279/i/2.gif?_sc=1002017672206000199&axd_pid=22&axd_fuid=BSasBSBsESaCBibkWSf-BiUABifkBDU0WifABifABifABfrr
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=UTF-8
hd-main.js
hgc-cf-cache-1.svonm.com/
183 KB
50 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=fUhjzkQaQr
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
54.230.44.222 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-44-222.fra6.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b3e55d92da4bcf79b3c673a5b27d327436ccb46a2ee5276e2a5aaf4dbe8e1550

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Wed, 11 Jul 2018 14:24:32 GMT
Content-Encoding
gzip
Vary
Accept-Encoding,Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
59
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
*
Last-Modified
Wed, 11 Jul 2018 14:24:32 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 6fd049110ebc3ac6deddab8b0bf5d686.cloudfront.net (CloudFront)
Cache-Control
no-cache
X-Amz-Cf-Id
DAIOKGXcsJl9pq1wnfzVlX_nbWRhYmDV3h7ora_22khWr_DIPziiYg==
truncated
/
183 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b3e55d92da4bcf79b3c673a5b27d327436ccb46a2ee5276e2a5aaf4dbe8e1550

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/javascript
1_hiudllfs
videoembed.chip.de/v3/videos/
1 KB
1 KB
Fetch
General
Full URL
https://videoembed.chip.de/v3/videos/1_hiudllfs
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx /
Resource Hash
3bebdf1209be7a7165753ad5d4a1120676205bb8c8c7b23ebe33982a7219c183

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Wed, 11 Jul 2018 20:06:01 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
839
Expires
Wed, 11 Jul 2018 20:06:01 GMT
activation
adstax-match.adrtx.net/ Frame 47B3
0
0
Document
General
Full URL
http://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: http://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Server
54.77.222.97 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-222-97.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.1 /
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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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
6EC0D69D1A88B4D11D947EB820B1E39D
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Wed, 11 Jul 2018 20:06:01 GMT
Server
akka-http/10.1.1
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
ima3.js
imasdk.googleapis.com/js/sdkloader/
232 KB
79 KB
Script
General
Full URL
http://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
2a00:1450:4001:812::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
d273db0f662ed916c6c6302d817a0e2a17eafe6080b0ff239a03e307dde17f8a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:01 GMT
Content-Encoding
gzip
X-Content-Type-Options
nosniff
Server
sffe
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
private, max-age=900
Accept-Ranges
bytes
Content-Length
80904
X-XSS-Protection
1; mode=block
Expires
Wed, 11 Jul 2018 20:06:01 GMT
100
videos.chip.de/p/1741931/sp/174193100/thumbnail/entry_id/1_hiudllfs/version/100011/acv/111/width/100/vid_slices/
136 KB
137 KB
Image
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/thumbnail/entry_id/1_hiudllfs/version/100011/acv/111/width/100/vid_slices/100
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:eb:193::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx/1.8.0 /
Resource Hash
23507a32a6b00da4bba440d963fbcae1a035a191cff622985da4237a7b0ce311

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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,b8c4c948bfdb5bab0be2c3eaeb973d48
X-Me
ny-front-thumb9
Date
Wed, 11 Jul 2018 20:06:01 GMT
X-Vod-Session
278746918
Connection
keep-alive
Content-Length
139509
Pragma
Last-Modified
Fri, 11 May 2018 13:12:14 GMT
Server
nginx/1.8.0
Vary
Accept-Encoding
X-Vod-Me
ny-front-vod11
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=2176
Accept-Ranges
bytes
X-Kaltura-Session
1363102918
Expires
Wed, 11 Jul 2018 20:42:17 GMT
iam.js
script.ioam.de/
26 KB
9 KB
Script
General
Full URL
http://script.ioam.de/iam.js
Requested by
Host: filestorage.chip.de
URL: https://filestorage.chip.de/videoplayer/videoplayer.db4b874c686da775482d.bundle.js
Protocol
HTTP/1.1
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 000f
Resource Hash
8204e994764cb94b0f57f40de12cc41c802694a290b04373af15d33624a75e39

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:01 GMT
Content-Encoding
gzip
Last-Modified
Wed, 11 Jul 2018 20:06:01 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 000f
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
Wed, 11 Jul 2018 22:06:01 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.220.0_en.html
imasdk.googleapis.com/js/core/ Frame 1C87
0
0
Document
General
Full URL
http://imasdk.googleapis.com/js/core/bridge3.220.0_en.html
Requested by
Host: imasdk.googleapis.com
URL: http://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
HTTP/1.1
Server
2a00:1450:4001:812::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

Host
imasdk.googleapis.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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
6EC0D69D1A88B4D11D947EB820B1E39D
Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b

Response headers

Accept-Ranges
bytes
Vary
Accept-Encoding
Content-Encoding
gzip
Content-Type
text/html
Content-Length
166169
Date
Wed, 11 Jul 2018 02:24:36 GMT
Expires
Thu, 11 Jul 2019 02:24:36 GMT
Last-Modified
Wed, 11 Jul 2018 02:11:24 GMT
X-Content-Type-Options
nosniff
Server
sffe
X-XSS-Protection
1; mode=block
Cache-Control
public, max-age=31536000
Age
63685
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: http://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
SPDY
Server
2a00:1450:4001:816::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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:01 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
Wed, 11 Jul 2018 20:06:01 GMT
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/
64 KB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/a.mp4
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:eb:193::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx/1.8.0 /
Resource Hash

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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
Wed, 11 Jul 2018 20:06:01 GMT
Access-Control-Allow-Methods
GET, HEAD, OPTIONS
X-Vod-Session
475377868
Content-Range
bytes 0-75873255/75873256
Connection
keep-alive
Content-Length
75873256
Last-Modified
Sun, 19 Nov 2000 08:52:00 GMT
Server
nginx/1.8.0
ETag
"3a1794b0-485bbe8"
X-Vod-Me
ny-front-vod1
Content-Type
video/mp4
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Server,Content-Length,Content-Range,Date
Cache-Control
max-age=3350636
Accept-Ranges
bytes
Access-Control-Allow-Headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
Expires
Sun, 19 Aug 2018 14:49:57 GMT
truncated
/
4 KB
0
Font
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
fa4b1286d83c2724401fe389061ba97f8d54777a020bce051d2a66ad90c6b5d4

Request headers

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

Response headers

Access-Control-Allow-Origin
*
Content-Type
application/font-woff;charset=utf-8
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/
739 KB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/a.mp4
Requested by
Host: www.chip.de
URL: http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Protocol
HTTP/1.1
Server
2a02:26f0:eb:1a1::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx/1.8.0 /
Resource Hash

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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=425984-

Response headers

Date
Wed, 11 Jul 2018 20:06:01 GMT
Access-Control-Allow-Methods
GET, HEAD, OPTIONS
X-Vod-Session
475377868
Content-Range
bytes 425984-75873255/75873256
Connection
keep-alive
Content-Length
75447272
Last-Modified
Sun, 19 Nov 2000 08:52:00 GMT
Server
nginx/1.8.0
ETag
"3a1794b0-485bbe8"
X-Vod-Me
ny-front-vod1
Content-Type
video/mp4
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Server,Content-Length,Content-Range,Date
Cache-Control
max-age=3350636
Accept-Ranges
bytes
Access-Control-Allow-Headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
Expires
Sun, 19 Aug 2018 14:49:57 GMT
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=5390476960
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvcHVXdWl2WGFoTGlvWWU9Vm9wdVd1aXZYYWhMaW9ZZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWGEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLmpzKG0pLGEuaHMoayksYS5VcigpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2o9dGhpcy5hWzFdO3RoaXMuUmc9dGhpcy5hWzZdO3RoaXMuUGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNF19Yy5OZz0KYjtiLnByb3RvdHlwZT17Tmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9qOnRoaXMuUWcoYSl9LFFnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SZzp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYT1jLk5nfHxlYSxIYz1uZXcgZWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1IYy5Oaig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5FYT0ic2V0dXAiO3RoaXMuZGM9W107dGhpcy5TZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkhyLmJpbmQodGhpcykpfWMubmk9YjtiLnByb3RvdHlwZT17U2U6ZnVuY3Rpb24oKXt0aGlzLmxhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LG9tOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YS5wb3N0TWVzc2FnZShiLCIqIil9LEdhOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxIcjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5HcihhLmRhdGEpfSxHcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMubGEuZXZlbnRsaXN0ZW5lci5sZW5ndGg7YisrKWEuZXZlbnQ9PQp0aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSxyZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxtbTpmdW5jdGlvbihhLGIpezA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sYmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7Zm9yKHZhciBkPTA7ZDx0aGlzLmxhLmVycm1zZy5sZW5ndGg7ZCsrKWIrPSJcbiIrdGhpcy5sYS5lcnJtc2dbZF07dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxEYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT0KdHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxoZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSXM6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sRGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9MCxjPTAsaD0wLGY9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7ZT11LmhlaWdodDswPnUudG9wJiYoZSs9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZS09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYKKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5lJiYoZT0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCplKTtoPj1iJiYoZj0hMCk7cmV0dXJuIGZ9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSwKQmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGU7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZT1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitlLGJ8PTA7cmV0dXJuIGJ9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGcrPWUudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxjLGg9QXJyYXkoODApLGY9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZT0wO2U8bi0zO2UrPTQpYz1hLmNoYXJDb2RlQXQoZSk8PDI0fGEuY2hhckNvZGVBdChlKzEpPDwxNnxhLmNoYXJDb2RlQXQoZSsyKTw8OHxhLmNoYXJDb2RlQXQoZSszKSwKcC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGUpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKyloW2VdPXBbYStlXTtmb3IoZT0xNjs3OT49ZTtlKyspaFtlXT1kKGhbZS0zXV5oW2UtOF1eaFtlLTE0XV5oW2UtMTZdLDEpO2M9ZjtuPXU7bD1rO3c9STtxPW07Zm9yKGU9MDsxOT49ZTtlKyspcj1kKGMsNSkrKG4mbHx+biZ3KStxK2hbZV0rMTUxODUwMDI0OSYKNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTIwOzM5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT00MDs1OT49ZTtlKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXI9ZChjLDUpKyhuXmxedykrcStoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2Y9ZitjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihmKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx3YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxlLGMsaCxmLHUsaz0wO2s8YS5sZW5ndGg7KWQ9CmEuY2hhckNvZGVBdChrKyspLGU9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LGY9KGUmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGUpP2Y9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sZ3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZT0hMSxjPSExLGg9ITEsZj0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtlPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRtPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGY9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1lO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1mO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxlcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuV2UoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxXYTpmdW5jdGlvbigpe3ZhciBhPXtZZzpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKamg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sWWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFltOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWcoKXx8YS5qaCgpfHxhLkdwKCl8fGEuWWooKXx8YS5DbCgpfX07cmV0dXJuIGEuWW0oKX0sS2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbYltlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGU9MCxjPWEubGVuZ3RoO2U8YzsrK2UpYi5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxiW2FbZV1dPTEpO3JldHVybiBkfSxvZjpmdW5jdGlvbihhKXthPXRoaXMuS2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSwkbjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxlPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8ZS5wdXNoKGFbY10pO3JldHVybiBlfSxGczpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGU9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZT1hLnNwbGl0KCIlIiksZD1iLzEwMCplKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGVmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54ZyhiKSsiOiIrdGhpcy54ZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZTpmdW5jdGlvbihhKXt0aGlzLkVhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU7ZC5zdGF0ZT10aGlzLkVhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2U9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGUpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxlLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5GYyhiLGQpKTtiJiYoaD1sLkZjKGEsYikpO2UmJihoPWwuRmMoaCxlKSk7YyYmKGg9bC5GYyhoLGMpKTtmLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBlPW0uYWUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uVGEoZSwhMCk7ZT1tLlRhKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRmEoZSxmdW5jdGlvbihkKXt2YXIgZT0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZT0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZT0hMSl9Y2F0Y2goYyl7fWV8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLAooZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oKXttJiZtLlk/bS5pc0VuYWJsZWQmJm0ueG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2QoKX0uYmluZCh0aGlzKSw1MDApfSxxbjpmdW5jdGlvbihhLGIpe2lmKGIuT2MoYSl8fCJhYm91dDpibGFuayI9PWF8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLmJmKGEpKXJldHVybiB0aGlzLmJmKGEpO3ZhciBkPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2QuaG9tYWRfdXJsX3N1ZmZpeD0KYTtkLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoYSk7ZC5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2QuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt2YXIgZT0hMSxjPSExLGM9dGhpcy5YYShhLGIudWEsZCxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWMpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMubW0oZSxhKTtyZXR1cm4gZX0sWGE6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZix1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suVGEoYSxoKTtoPWsuVGEoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5GYShoLGUsYywiIiwiIixmKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoYSxiLGQsZSxjLGssZix1KX0uYmluZCh0aGlzKSw1MDApfSxGcTpmdW5jdGlvbihhLGIsZCxlLGMsaCxmKXt2YXIgdT0hMDtmJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtmPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZilkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGZba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZShsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sR3E6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRnEoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZGMpZm9yKHZhciBjIGluIHRoaXMuZGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5kY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2Yud2IoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTWY6ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5YYShhLGUudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkdxKGUuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZSwhMCl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRjPWF9LGt1OmZ1bmN0aW9uKGEsYixkLGUsYyl7dGhpcy5YYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmV9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX0pfSxabTpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LGJxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLm5pfHxQO25ldyBQO3ZhciBmPW5ldyBQO3dpbmRvdy5CdT1mOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1pPWI7Yi5GYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGU7Zm9yKGUgaW4gYilkW2VdPWJbZV07Zm9yKGUgaW4gYSlkW2VdPWFbZV07cmV0dXJuIGR9O2IudXI9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnE9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ0PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuSm89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZtPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLiRsPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5jbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5obT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWmw9e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLmFtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuenQ9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVxPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLktvPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdT17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Mbj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlFuPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuemM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuZW09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5JZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuSGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuaW09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5ibT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iud3Q9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5XcT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMubWl8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHI9dGhpcy5hWzVdO3RoaXMuQXE9dGhpcy5hWzRdO3RoaXMuS249dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19CmMudXE9YjtiLnByb3RvdHlwZT17b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnByOnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5BcTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgZmE9Yy51cXx8ZmEsSmM9bmV3IGZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMub3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5vaT1iO2IucHJvdG90eXBlPXtCZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZSxjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBNYXRoLmFicyhiKX0sCmViOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxtcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxHYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTsKaWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxNYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5HYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYygpKyIyIn0sQmY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLm1wKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09CmIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5vaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueHI9dGhpcy5hWzhdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMuS2s9dGhpcy5hWzRdO3RoaXMudm09dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzVdO3RoaXMuZHQ9dGhpcy5hWzddO3RoaXMubnE9dGhpcy5hWzVdO3RoaXMuQmk9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbN119Yy5VaD1iO2IucHJvdG90eXBlPXt3cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueHI6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ0OnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lazp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudm06dGhpcy5hcyhhKX0sYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5iczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZHQ6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5xOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhhPWMuVWh8fGhhLEtjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLndyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGU9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZVtjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGdbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5pO3RoaXMuaT1kW2FdO3ZhciBlPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaT1nO3JldHVybiBlfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBlLmM/ZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2UuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1lO2UuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51ZT1ifSkoYyk7dmFyIEo9Yy51ZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbOF07dGhpcy54aT10aGlzLmFbOF07dGhpcy5ycj10aGlzLmFbNl07dGhpcy5odD0KdGhpcy5hWzNdO3RoaXMuVG89dGhpcy5hWzEwXTt0aGlzLllxPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuR3M9YjtiLnByb3RvdHlwZT17TWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5pOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGk6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJyOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odDp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVG86dGhpcy5YcShhKX0sWHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLkdzfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuTWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5vaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5rcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGtzOmZ1bmN0aW9uKGIpe3RoaXMuQT0KYn0sbHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxMOmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5lYigpXT1iO0smJksuS2YmJksuSnMoYil9LEp1OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmViKCldPyEwOiExfSxmcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFh1OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMub2t8fHI7KGZ1bmN0aW9uKGMpe2MucWs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9Cm51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuZmI9IiI7dGhpcy5ZZT0hMTt0aGlzLk4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSx0czpmdW5jdGlvbihiKXt0aGlzLko9Yn0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxuczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LEl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LAppc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxZdTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcCgpfHx0aGlzLmptKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEx1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGptOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPwohMDohMX0sTzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxDYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxoYjpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmZiPQpifSxIdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZifSxXcjpmdW5jdGlvbigpe3RoaXMuZmI9bnVsbH0sTnU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmZiJiYoYj0hMCk7cmV0dXJuIGJ9LFR1OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxFdTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5xa3x8cDsoZnVuY3Rpb24oYyl7Yy5NZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLlZsPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuS2U9dGhpcy5CZz0hMTt0aGlzLnN0YXR1cz10aGlzLmljO3RoaXMuaWQ9Zi5wYSgxMCk7dGhpcy5ZYyhiKTt0aGlzLmxzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLnFzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy50YiYmMDx0aGlzLnRiLmxlbmd0aCYmKHRoaXMudGI9Zi51bmlxdWUodGhpcy50YiksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sTXU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LHFzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuRWV9LHJzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5WbH0sQ2I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGxzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxscDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEpxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5NZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hbz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLlNnPWI7Yi5wcm90b3R5cGU9CntGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlNnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Gbyg0KTsoZnVuY3Rpb24oYyl7Yy5yaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LApwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLnJofHxSOyhmdW5jdGlvbihjKXtjLnFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuR3Q9MUUzO3RoaXMuV2Y9bnVsbDt0aGlzLml0PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy4kbSliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLllvLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5CcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLkFwKGEsCmIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuSnQoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLkt0KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuenAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sT246ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxKdDpmdW5jdGlvbihiKXt0aGlzLmdkfHwodGhpcy5nZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTHQoYil9LmJpbmQodGhpcyksdGhpcy5HdCkpfSxMdDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCk7dGhpcy53KCl9LEt0OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdkKX0sCnpwOmZ1bmN0aW9uKGIpe3RoaXMuenUoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuRHI8dGhpcy5pdD90aGlzLncoKTp0aGlzLm0oKX0sQnA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxZbzpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXt0aGlzLkRyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMucWh8fGxhOyhmdW5jdGlvbihjKXtjLnNoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGYuRGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgUihiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBsYShnLAp0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5zaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs3XTt0aGlzLkptPXRoaXMuYVs0XTt0aGlzLnJtPXRoaXMuYVs4XTt0aGlzLlVtPXRoaXMuYVs4XTt0aGlzLlNzPXRoaXMuYVsxXTt0aGlzLkRuPXRoaXMuYVs0XTt0aGlzLll0PXRoaXMuYVs1XTt0aGlzLnJsPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuSW49YjtiLnByb3RvdHlwZT17Ums6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNrOnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KbTp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm06dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMuUnMoYSl9LApSczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3M6dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRuOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5Jbnx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMuUmsoNCk7KGZ1bmN0aW9uKGMpe2MuWmk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT0KYi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSx0aGlzLmVxPSEwKTt0aGlzLlIoYSk7dGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmVxKXt0aGlzLmNxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksCjUwKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT0KYi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxoYjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7CnZhciBwYT1jLlppfHxwYTsoZnVuY3Rpb24oYyl7Yy5ZaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5hYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYWI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJgoodGhpcy5DYigpLHRoaXMuZ2V0UGxheWVyKCkuUG49ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmZiO2EmJihhLlRkKCksYS5BYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTsKaWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlBmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToKKHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm1jLmxlbmd0aD49dGhpcy5wZCYmdGhpcy5vKCkpfSxKcTpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtmLklzKGEudmlkZW9UYWcpJiYoYS5jcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLllpfHxxYTsoZnVuY3Rpb24oYyl7Yy4kaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmlwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYKIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHBhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5JKGcpfHx0aGlzLmZxKGcpfHwodGhpcy5MKGcpLGc9bmV3IHFhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGlwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy4kaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1rPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs5XTt0aGlzLlNwPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy5IcD1iO2IucHJvdG90eXBlPQp7bGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56aTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB0YT1jLkhwfHx0YSxPYz1uZXcgdGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1PYy5sayg0KTsoZnVuY3Rpb24oYyl7Yy5HbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLk8oYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlIoYik6dGhpcy5IKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTt2YXIgdWE9Yy5HbHx8dWE7KGZ1bmN0aW9uKGMpe2MuRmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHZhPWMuRmx8fHZhOyhmdW5jdGlvbihjKXtjLkhsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYwPGYuRGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9Cm5ldyB1YShnKSx0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyB2YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19KX0pKGMpO3ZhciB3YT1jLkhsfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGc9dGhpcy5hWzldO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzVdO3RoaXMudXQ9dGhpcy5hWzNdO3RoaXMuT2g9dGhpcy5hWzRdO3RoaXMuc289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5IbT1iO2IucHJvdG90eXBlPXtPZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUGc6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kcTp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnV0OnRoaXMuTmgoYSl9LE5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PaDp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB5YT1jLkhtfHx5YSxQYz1uZXcgeWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5PZyg0KTsoZnVuY3Rpb24oYyl7Yy51bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5PKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmI/dGhpcy5SKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5KJiZ0aGlzLkooKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/CmIuYXV0b3BsYXkoKTohMX0samI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLnVsfHx6YTsoZnVuY3Rpb24oYyl7Yy50bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMudW4oKTsKdGhpcy5IYSgpfSxVdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFZiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj0KdGhpcy5TYSgpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLlhiPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlhifSxhcTpmdW5jdGlvbigpe2lmKCF0aGlzLnhmKXt2YXIgYj10aGlzLlNhKCksYT10aGlzLlpwKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LFpwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuV2EoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5XKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sRnU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSx1bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8CmIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFxKCkpe3ZhciBhPXRoaXMuU2EoKSxnPXRoaXMuVmIoKTthJiZnJiYodGhpcy5TYSgpLHRoaXMuVmIoKSx0aGlzLnRkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGQ/dGhpcy5tKCk6KHRoaXMuVyghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuU2EoKX1lbHNlIHRoaXMueWY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fAp0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2bjpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/Cih0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLnpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLnpnLGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxBbjpmdW5jdGlvbigpe3RoaXMuUHV8fCgxMDx0aGlzLkh0Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5IdCsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLlZyKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTApKSl9LFZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5JdCl7dGhpcy5JdD0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQWE9Yy50bHx8QWE7KGZ1bmN0aW9uKGMpe2Mudmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPApmLkRhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IHphKGJbZ10pLGEuamF8fHRoaXMuSShhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgQWEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSDpmdW5jdGlvbigpe3RoaXMucWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5hYyl9fSl9KShjKTt2YXIgQmE9Yy52bHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZpPXRoaXMuYVszXTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLnN0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuZ3I9YjtiLnByb3RvdHlwZT17dWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZpOnRoaXMuSnIoYSl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuS3I6dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5ncnx8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMudWkoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5PKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGhiOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMuWGt8fEVhOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoITApOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy53KCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5tKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWMuYmluZCh0aGlzKSwxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksCnRoaXMubSgpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLnpiJiYodGhpcy56Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWN8fCh0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpOwpiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuZWM9ITAsdGhpcy5tKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMuV2t8fEZhOyhmdW5jdGlvbihjKXtjLllrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmCnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgRWEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEZhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBHYT1jLllrfHxHYSxIYT1uZXcgR2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzRdO3RoaXMudms9dGhpcy5hWzJdO3RoaXMuaHU9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzldO3RoaXMudHI9dGhpcy5hWzNdO3RoaXMucHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbM119Yy5mbz1iO2IucHJvdG90eXBlPXtVbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVm86dGhpcy51ayhhKX0sdWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZrOgp0aGlzLmd1KGEpfSxndTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaHU6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhqOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy50cjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5mb3x8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuVW8oNCk7KGZ1bmN0aW9uKGMpe2MuYmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlOwp0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy5iaHx8SmE7KGZ1bmN0aW9uKGMpe2MuYWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTsKYi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMuYWh8fEthOyhmdW5jdGlvbihjKXtjLmRoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLApkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBKYShkLGEpLHRoaXMuSShkKXx8KGQuTGQoYSksdGhpcy5MKGQpLGQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy5kaHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVsyXX1jLmpqPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54bzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIE5hPWMuamp8fE5hLFNjPW5ldyBOYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53byg0KTsoZnVuY3Rpb24oYyl7Yy51aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5PKGIpO3RoaXMuUihiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJgowPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBPYT1jLnVqfHxPYTsoZnVuY3Rpb24oYyl7Yy50aj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5XYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5sYygpfSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD8KYi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFBhPWMudGp8fFBhOyhmdW5jdGlvbihjKXtjLnZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgT2EoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBQYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgUWE9Yy52anx8UWEsUmE9bmV3IFFhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzRdfQpjLmFuPWI7Yi5wcm90b3R5cGU9e2tuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIFNhPWMuYW58fFNhLFRjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLmtuKDQpOyhmdW5jdGlvbihjKXtjLmJrPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuVWQ9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmRhKCk7cmV0dXJufXRoaXMuTyhhKTsKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUihiKTp0aGlzLmRhKCl9LEVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmIsZz10aGlzLmViKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLlRkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5VZD0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LGpiOmZ1bmN0aW9uKCl7dGhpcy5VZCsrOwppZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sSzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZWE6ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9fSl9KShjKTsKdmFyIFRhPWMuYmt8fFRhOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5nYnx8KHRoaXMuZ2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5nYisrLDE1PHRoaXMuZ2IpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuVmEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMuV28/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsCmZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLldvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5FcihhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgVWE9Yy5ha3x8VWE7KGZ1bmN0aW9uKGMpe2MuY2s9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IFVhKGEsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBWYT1jLmNrfHxWYSxXYT1uZXcgVmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGw9dGhpcy5hWzddO3RoaXMuTG09dGhpcy5hWzVdO3RoaXMuV2g9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsyXTt0aGlzLmpyPXRoaXMuYVsxMF07dGhpcy5SaT10aGlzLmFbOF07dGhpcy5wbD10aGlzLmFbN107dGhpcy54aj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsxMF19Yy5kcz1iO2IucHJvdG90eXBlPXtTbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlRsOnRoaXMuS20oYSl9LEttOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG06dGhpcy5WaChhKX0sVmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldoOnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lbzp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuanI6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJpOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbDp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBYYT1jLmRzfHxYYSxVYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0KVWMuU2woNCk7KGZ1bmN0aW9uKGMpe2MuaWk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLk8oYi5lbGVtZW50KTt0aGlzLlIoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgWWE9Yy5paXx8WWE7KGZ1bmN0aW9uKGMpe2MuaGk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBaYT1jLmhpfHxaYTsoZnVuY3Rpb24oYyl7Yy5qaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgWWEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFphKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgJGE9Yy5qaXx8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsyXTt0aGlzLlhpPQp0aGlzLmFbMTBdO3RoaXMuV3A9dGhpcy5hWzEwXTt0aGlzLmNpPXRoaXMuYVsxXTt0aGlzLkR0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuaHI9YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pazp0aGlzLldpKGEpfSxXaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGk6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2k6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgYmI9Yy5ocnx8YmIsVmM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuaGsoNCk7CihmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0saGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sem46ZnVuY3Rpb24oKXtmLkRmKHRoaXMuRGMpO2YuRWYodGhpcy5EYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpuKCl9LmJpbmQodGhpcyksNTApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgY2I9Yy5UaXx8Y2I7KGZ1bmN0aW9uKGMpe2MuU2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGRiPWMuU2l8fGRiOyhmdW5jdGlvbihjKXtjLlVpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiYKay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBlYj1jLlVpfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQnI9dGhpcy5hWzFdO3RoaXMuem89dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzJdO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuUWs9dGhpcy5hWzldO3RoaXMuJHQ9dGhpcy5hWzJdO3RoaXMuZmg9dGhpcy5hWzVdO3RoaXMuTGk9dGhpcy5hWzEwXTt0aGlzLnltPQp0aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLndtPWI7Yi5wcm90b3R5cGU9e0FyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ccjp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem86dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZyOnRoaXMucG8oYSl9LHBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xbzp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFrOnRoaXMuWnQoYSl9LFp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJHQ6dGhpcy5laChhKX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZoOnRoaXMuS2koYSl9LEtpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaTp0aGlzLnhtKGEpfSx4bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueW06dGhpcy5EbChhKX0sRGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRWw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy53bXx8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuQXIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnBpPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sa206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5waXx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwyMDAhPWYuc3RhdHVzJiYyMDEhPWYuc3RhdHVzfHxnKGYpO2lmKGQmJjQ9PWYucmVhZHlTdGF0ZSYmMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1cylkKGYpO2Vsc2UgaWYoND09Zi5yZWFkeVN0YXRlJiYwPT1mLnN0YXR1cyYmbSYmbS5GZCh0aGlzLklhLnVybCkmJm0uZGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLm1zKCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMucmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZGYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLm5nP3RoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMSk6dGhpcy5OYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCEwKSx0aGlzLktnfHwodGhpcy5OYS53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiZtLkZkKHRoaXMuSWEudXJsKT9tLmRkP20uZ2EoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uRmQodGhpcy5JYS51cmwpLHRoaXMuVGYmJnRoaXMuVGYoKX1yZXR1cm4gdGhpcy5OYX19fSkoYyk7dmFyIGhiPWMucml8fGhiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLk9iPSIiO3RoaXMudWQ9dGhpcy5iYj1udWxsO3RoaXMuYW89dGhpcy5uYj10aGlzLkxmPSExO3RoaXMudWE9IiI7dGhpcy5HZj0hMTt0aGlzLnphPXRoaXMuSmM9IiI7dGhpcy5DZj10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5oYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSGI9IiI7dGhpcy5vYj1bXTt0aGlzLkliPVtdO3RoaXMuR2I9IiI7dGhpcy5sZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNkPSExO3RoaXMuQm49dGhpcy5lZD1udWxsO3RoaXMuZmM9dGhpcy5BZz10aGlzLm5lPXRoaXMuZGQ9dGhpcy52ZD10aGlzLmpjPSExO3RoaXMuUGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fQpjLnNpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLmFvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuR2YsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMuemEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5ZLGlzQmxvY2tlZDp0aGlzLkNmLHNlcnZlcjp0aGlzLk1hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMudGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy55ZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5rZSxIT01BRF9WRVJJRklFRDp0aGlzLnllLEhPTUFEX0JMT0NLRUQ6dGhpcy53ZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5zYiwKSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkJuLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuamMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnZkLHVzZVN0cmljdENoZWNrczp0aGlzLmRkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUGEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMuZmcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuZmN9fSxEcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYKMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxqcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1mLlptKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5PYnx8dGhpcy5iYnx8dGhpcy51ZCkmJihrPXRoaXMuUXEoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5rcChmLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LApPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxaYjpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5NYSYmdGhpcy5NYS5sZW5ndGgmJjA8dGhpcy5NYS5sZW5ndGgmJihiPXRoaXMuTWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGtwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnh1O3JldHVybiJub25lIn0sTGM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYVt0aGlzLmZnXX0sYWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLmpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LFFxOmZ1bmN0aW9uKGEpe3RoaXMuT2ImJgooYSs9dGhpcy5PYik7aWYodGhpcy5iYilmb3IodmFyIGIgaW4gdGhpcy5iYil0aGlzLmJiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmJiW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj1oO3RoaXMuRXEoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuemEpdGhpcy5DcSgpO2Vsc2UgdHJ5e3RoaXMuemE9YigpLHRoaXMud2MoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEVxOmZ1bmN0aW9uKCl7dGhpcy5GYShuZXcgeih0aGlzLkpjK3RoaXMub2MoImdsb2JhbCIpKSwKdGhpcy55cC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxDcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnZkKXt0aGlzLnZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwppZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMud2UpKTt0aGlzLnJiKCk7Zi5UYihsLnVyKTsoYj1mLm9mKHRoaXMuTGMoKSkpfHwoYj1mLm9mKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx5cDpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDsKdGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuemF9ZWxzZSBhPXRoaXMuemE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5NYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMudGY9YS5hZHBhdGh8fCIiO3RoaXMueWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5mZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5NYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiYKdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5hZSgpKSxjPXRoaXMuS2EodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMub2MoImN1c3RvbWVyIikpO3RoaXMuRmEoYix0aGlzLk1zLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNlKCJjdXN0b21lciIpO2E/dGhpcy5Haz90aGlzLmdhKCJub1NWTUNvbmZpZyIpOgoodGhpcy5Haz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LE1zOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLm5lPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuQWc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLm9iPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5zcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMueWQmJih0aGlzLkdiPW51bGwpO3RoaXMubGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5DZCYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuQ2Q9ITAsdGhpcy5RYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5mdCgpJiYodGhpcy5IYnx8dGhpcy5JYnx8dGhpcy5vYnx8dGhpcy5HYik/dGhpcy5aZD8odGhpcy5vYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuc2IpKSwKdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5WcygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLldzKCkpfX0sVnM6ZnVuY3Rpb24oKXt0aGlzLlVzKCl9LFdzOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYShhKSksdGhpcy5yYigpLHRoaXMud2QoKSl9LFVzOmZ1bmN0aW9uKCl7aWYodGhpcy5IYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5xZygpfWVsc2UgdGhpcy5xZygpfSxwZzpmdW5jdGlvbigpe3ZhciBlO3ZhciBjO2Z1bmN0aW9uIGEoKXtlPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlpzKGUsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5pZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuY2QodGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfXRoaXMub2I9bnVsbCx0aGlzLmllKCl9LFpzOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7ZigpJiYKYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy4kcyhlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuSWImJnRoaXMuSWIubGVuZ3RoKXt2YXIgYz10aGlzLkliLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGcoKX0sJHM6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoKXtoKCkmJmIoKX1mdW5jdGlvbiBmKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7bC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtsLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2wub25sb2FkPWU7bC5vbmVycm9yPWY7bC5zcmM9YTtsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChtKXtlKCl9fSxpZTpmdW5jdGlvbigpe3RoaXMuR2I/KHRoaXMua2UrKyx0aGlzLkZhKG5ldyB6KHRoaXMuR2IpLHRoaXMuVHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuamUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5vZygpfSxqZTpmdW5jdGlvbihhKXt0aGlzLmNkKHRoaXMueGUsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVHM6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLm9nKCk6dGhpcy5qZSgiQUFBIil9LG9nOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpO3RoaXMud2QoKX0scmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7Zi5XYSgpJiYoYT0iMSIpO3RoaXMuamMmJihiPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnllKSk7dGhpcy5lZCYmImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSx5bjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuRHAoKSl7dmFyIGE9dGhpcy5qcCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxGYTpmdW5jdGlvbihhLGIsYyxlLGgsSWMpe2E9bmV3IGhiKGEsYixjKTtlJiYoYS5LZz0hMCk7aCYmZi5ncSgpJiYoYS5kZj0hMCk7SWMmJihhLm5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LE9lOmZ1bmN0aW9uKCl7Zi5XYSgpfHxmLlhhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSwKZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtlPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuWmIoKXx8KGE9dGhpcy5LYShlKSxlPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PQpoLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx4bjpmdW5jdGlvbigpe3RoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiOwphLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy55dC5iaW5kKHRoaXMpLHRoaXMueHQuYmluZCh0aGlzKSl9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXtyZXR1cm59Y3x8dGhpcy5MbygpfSx4dDpmdW5jdGlvbigpe30sTG86ZnVuY3Rpb24oKXtmLlRiKGwuS28pO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHdkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMubmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5uYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLm5iW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZmLlhhKGIudXJsLApiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LGZ0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZSxmLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLAplPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGU9MTQ7ZS0tOyljW2JbZV1dPWFbZV18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxmLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGUpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTIwOzM5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT00MDs1OT49ZTtlKyspeD1jKGYsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXg9YyhmLDUpKyhuXnBedykrdCtoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsCmY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuc2l8fGliLG09bmV3IGliO3dpbmRvdy5DdT1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLnlxPXRoaXMuYVsxXTt0aGlzLnJxPXRoaXMuYVs4XTt0aGlzLmtvPXRoaXMuYVs0XTt0aGlzLlV0PXRoaXMuYVs1XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnF0PXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVsxMF07dGhpcy5HbT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs4XX1jLk1wPWI7Yi5wcm90b3R5cGU9e1ZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Xbjp0aGlzLnhxKGEpfSwKeHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlxOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ycTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua286dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlV0OnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5kbDp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXQ6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxwOnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBqYj1jLk1wfHxqYixYYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuVm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5YbT0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5wbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTsKdGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMuanQ9dGhpcy4kYT0hMX1jLmxpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiZ0aGlzLmNvbmZbdGhpcy5MYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLkxhXVthXSk7cmV0dXJuIGJ9LHVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkVhJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLAoiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLmRtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLiRhPWM7aWYodGhpcy5ULlkpdGhpcy5ULnluKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDohMH0pKTp0aGlzLkFhKCk7ZWxzZXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLkpkKGEsYixjKX0sNTApfX0sVmQ6ZnVuY3Rpb24oYSl7dGhpcy5FYz0KITE7dGhpcy5zPWE7dGhpcy51cyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMudXAoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sdXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8ZS5sZW5ndGg7aysrKWVba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLAplW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlP2YuRChsLlJ0LHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk6KGYuS2QoKSxiPT1DLkJlLmNvZGUmJmYuRChsLlVxLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpO2YuRChsLkpvLHRoaXMucy5QLHRoaXMuai51LkIoKSwKdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC56dCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5hdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuZHUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuVnEsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSxmLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGYudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsCiIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sdXM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuVnU9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249CnRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5wbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMubG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLm5tKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5NbigpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnNzKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sc3M6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmZi5vbSh0aGlzLnMub3JpZ2luLnRlKTtmLlphKCJzZXRVcFZwYWlkIik7dmFyIGI9dGhpcy5qLkM7dGhpcy5qLkM9Qi5wb3AoKTtiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuai5DLApiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5qLkcuYXBwZW5kQ2hpbGQodGhpcy5YKTt0aGlzLlgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zLndwKCksYz1hKHRoaXMucy5QLk9yaWdpbmFsQWRQYXJhbWV0ZXJzKSwKZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7Yj1mLnFuKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTXQoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnQoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF0KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB0KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk90KCkpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcykpOwpmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LE50OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LE10OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuWmEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuWmEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuWmEoImZpcnN0UXVhcnRpbGUiKX0sUXQ6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi5aYSgidGhpcmRRdWFydGlsZSIpfSxQdDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5aYSgiY29tcGxldGUiKX0sT3Q6ZnVuY3Rpb24oKXtmLlphKCJhZHN0b3BwZWQiKTt0aGlzLkFhKCl9LGxtOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7dmFyIGU9YixmPXRoaXMuVDsKZi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLkZ0LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxubTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LFhjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IiwKdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG0pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuV2EoKSYmdGhpcy5ULkFnJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5zLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5BYnx8KHRoaXMuQWI9ITAsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLlQuZ2EoInZpZGVvLW5vb3AiKSk7CnJldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLkV0KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9dGhpcy5qLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuS2MucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCmZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5CYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmhlKCkpfS5iaW5kKHRoaXMpOwp0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5abCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LEZ0OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5FZCgpPwp0aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuanQpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm10KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5nZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5rZyk7YyYmKGI9dGhpcy5zLmdlLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwuZW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5wYy5yZXBsYWNlKCJbdGltZV0iLGYuZWYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5wcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5jYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLnduLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0scHA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLlpiKCkmJihmPWguS2EoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7ZS51cmw9ZjthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKd246ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtdDpmdW5jdGlvbihhKXthPT10aGlzLndnfHx0aGlzLkFifHwoMD09YSYmKHRoaXMuJGEmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuJGEpLHRoaXMuJGE9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuV2EoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGYuRChsLmFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi5EKGwuZm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSx0aGlzLlJiJiZmLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLiRsLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC5jbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5EKGwuaG0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSksZi5EKGwuaW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSwKdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnZwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmJxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YuRChsLmJtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSx7YWRJZDp0aGlzLmJkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5JZChlLnVybCxlLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy55YT10aGlzLlhuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5rbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0sdnA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxYbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxFdDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSxFZzpmdW5jdGlvbigpe2YuRChsLkxuLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkVjJiZmLldhKCkmJmYudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZi5lcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMua3QuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5XYi5iaW5kKHRoaXMpKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9lLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtlLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5nZSYmYS5hcHBlbmRDaGlsZChlKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LmhiJiZ0aGlzLmoudS5oYigpJiZ0aGlzLlJxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxsdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEJiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5jYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhkKCl9ZWxzZSB0aGlzLnhkKCl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMDt0aGlzLmouc2YoKTsKdGhpcy5qLlpyKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5XcigpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGYuRWYodGhpcy52aWRlbyxhKT90aGlzLllyKCk6dGhpcy5UZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmxpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVs4XTt0aGlzLmdpPXRoaXMuYVsyXTt0aGlzLkJvPXRoaXMuYVsxMF07dGhpcy5KbD10aGlzLmFbN107dGhpcy5Iaj10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLlFtPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/CnRoaXMuRG86dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk9yOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5naTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQm86dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iajp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy5RbXx8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuYWE9bnVsbDt0aGlzLk1iPSExO3RoaXMudGU9IiI7dGhpcy5zZT0hMTtkJiZkLmVtcHR5P3RoaXMuSXEoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5zbD1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5XZSgpLGI7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS5UYShtLktzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSHEuYmluZCh0aGlzKSx0aGlzLkRxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkVhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5FYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuRWEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwKMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxIcTpmdW5jdGlvbihhKXt0aGlzLlByKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSXE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQmEoeC5rZCkpfXRoaXMuYmE9dGhpcy5mZigpO3RoaXMuTWI9dGhpcy5yZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuUmMoKTp0aGlzLmZhKHRoaXMuQmEoeC5nYyx7ZXJyb3I6dGhpcy5zZT9DLmpkOkMuQWV9KSl9LERxOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkJhKHguemUse2RlcHRoOmF9KSl9LFJjOmZ1bmN0aW9uKCl7dGhpcy5hYT10aGlzLmJhLnNoaWZ0KCk7dGhpcy5pcSgpP3RoaXMuYXQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy52dCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSx2dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLllzKCk/dGhpcy5YcygpPyEwOigtMSE9dGhpcy5VYigpPwp0aGlzLmZhKHRoaXMuQmEoeC52ZSkpOnRoaXMuZmEodGhpcy5CYSh4Lm5oKSksITEpOih0aGlzLmZhKHRoaXMuQmEoeC5nYyxDLkJlKSksITEpfSxWZDpmdW5jdGlvbihhKXthLnlhPWEueWEuY29uY2F0KHRoaXMuTWQoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy5NYjt0aGlzLnBhcmVudC5WZChhKX0sU246ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbGI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMubGYoKTthLnZjPXRoaXMuZnAoKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLmJwKCk7YS5nZT10aGlzLnRwKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLmhwKCkpOmIueWEuY29uY2F0KHRoaXMubnAoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksCmE9MCx0aGlzLlJjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYSYmdGhpcy5wYXJlbnQuZmEoYiksYT0wKX0seGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQueGIoYSl9LCRlOmZ1bmN0aW9uKGEsYil7dGhpcy5mYSh0aGlzLkJhKGEsYikpfSxCYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBtYihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGF0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sWXM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxYczpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sUHI6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuc2U9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnFmKCkubGVuZ3RofSxxZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFwKHRoaXMuYWEsIlZBU1RBZFRhZ1VSSSIpfSxNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sCm5wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LGhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxmcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnliKHRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApBdTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy55YihhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LGJwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0KIiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMucmYoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2YucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sdHA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5GcyhnLGEpLDA+CmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxxcDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMueWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHhwOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx5YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJmKGEpOiIifSxyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnhwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5zbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gbj10aGlzLmFbMV07CnRoaXMuZnM9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzhdO3RoaXMuUWo9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy53aD1iO2IucHJvdG90eXBlPXtFbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRm46dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZzOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qbzp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBuYj1jLndofHxuYixaYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT0KW107dGhpcy52Yz0iIjt0aGlzLlA9dGhpcy52Yj0hMTt0aGlzLm9yaWdpbj1udWxsfWMubms9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sd3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBsYj1jLm5rfHxsYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scj10aGlzLmFbNl07dGhpcy5ZaD10aGlzLmFbMTBdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOV19Yy5IaD1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlloOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56cjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIG9iPWMuSGh8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5rcig0KTt2YXIgeD17a2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LG5oOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxnYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxDZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHplOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0saGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnB1Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSx2ZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17QWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sQmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0scnU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubnI9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbM119Yy5hcj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5yOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMuYXJ8fHBiLGFkPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLm1yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5LaD1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMuS2h8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naz10aGlzLmFbOF07dGhpcy5MbD10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbMTBdO3RoaXMuZW49dGhpcy5hWzldO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbMl19Yy5Maz1iO2IucHJvdG90eXBlPXtmazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2s6dGhpcy5LbChhKX0sS2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkpwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5Ma3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PWJkLmZrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMudGg9YjtiLnByb3RvdHlwZT17Z2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLiRwKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PQp3aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2UmJihoLnBvc2l0aW9uPWUpO3JldHVybiBofSxMczpmdW5jdGlvbigpe3RoaXMuSWY9ITB9LHlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sVmY6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtmLkQobC55Yyx0aGlzLnUuQigpKX0sWnI6ZnVuY3Rpb24oKXt0aGlzLklmfHwodGhpcy51LnBsYXkoKSxmLkQobC56Yyx0aGlzLnUuQigpKSl9LGNjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKwoicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlFhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUWEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUWEpO3RoaXMudS5EYiYmdGhpcy51LkRiKCk/dGhpcy51LmdmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy51Zi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sJHA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGdwOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LHVmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5RYSk7aWYoYi54IT10aGlzLlJhLnh8fGIueSE9dGhpcy5SYS55fHxiLnBvc2l0aW9uIT10aGlzLlJhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlJhLndpZHRofHxiLmhlaWdodCE9dGhpcy5SYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5SYS53aWR0aCYmMDx0aGlzLlJhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuc2YoKTtyZXR1cm59dGhpcy5SYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLnZmLmxlbmd0aDthKyspdGhpcy52ZlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxzZjpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkcpO3RoaXMuQyYmdGhpcy5DLnBhdXNlJiZ0aGlzLkMucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBOPWMudGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0KImJsb2NrIjtMLmlkPWYucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLFk9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vbz10aGlzLmFbOF07dGhpcy4kZz10aGlzLmFbMTBdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuQW09dGhpcy5hWzEwXTt0aGlzLkVtPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzhdfWMuZXQ9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9vOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kZzp0aGlzLnZzKGEpfSwKdnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLndzOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQW06dGhpcy5EbShhKX0sRG06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgc2I9Yy5ldHx8c2IsY2Q9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2Qubm8oNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpOwp0aGlzLk8oYSk7dGhpcy5mZShiKTt0aGlzLlhlKCl9LGZlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQ2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlIoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQ2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB0Yj1jLlVqfHx0YjsoZnVuY3Rpb24oYyl7Yy5Uaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9WigpO3RoaXMudWI9dGhpcy51Ynx8ITE7dGhpcy5HZT10aGlzLkplPXRoaXMuemY9dGhpcy5pYT10aGlzLm1lPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLApiKXt0aGlzLlhvKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5tZT0hMDt0aGlzLnpmJiZ0aGlzLlJlKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZmI7YSYmYS5ZYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy56Zj0hMDt0aGlzLlJlKCl9LmJpbmQodGhpcykpO3RoaXMuTmUoKX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy51Yil7dGhpcy50YygpO2lmKCF0aGlzLm1lJiYhdGhpcy50YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwKMTAwKSwhMDt0aGlzLm1lJiZ0aGlzLkdlJiYhdGhpcy5KZSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19LHRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxtZjpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxOZTpmdW5jdGlvbigpe2lmKHRoaXMudGMoKSl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkplPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuR2U9Yi53dX10aGlzLmhhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmUoKX0uYmluZCh0aGlzKSwxMDApfSxEdTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5RdSgpOiExfSxVYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuVWIoKTotMX0sb3A6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sWG86ZnVuY3Rpb24oYixhKXt0aGlzLnViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMudWJ8fDMwMj09dGhpcy51Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy51Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX0seGM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPyh0aGlzLm0oKSx0aGlzLm5hKCkpOmIuTmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciB1Yj1jLlRqfHx1YjsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGhxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLnJrLldsLlVsP3dpbmRvdy5PTy5yay5XbC5VbC51dShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ocSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPVooKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxmLkRhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB0YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgdWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIHZiPWMuVmp8fHZiLHdiPW5ldyB2YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcT10aGlzLmFbOF07dGhpcy5Ibj10aGlzLmFbNV07dGhpcy5DbT10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs3XX1jLlZpPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLkduKGEpfSwKR246ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5DbTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3U6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy5WaXx8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuTHEoNCk7KGZ1bmN0aW9uKGMpe2MuVWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5Va3x8eWI7KGZ1bmN0aW9uKGMpe2MuVGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp5LnFkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuYnIoYSl9LmJpbmQodGhpcykpO3kuQ3AoKX0sYnI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7CnRoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgemI9Yy5Ua3x8emI7KGZ1bmN0aW9uKGMpe2MuVms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuJG4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9CltdKTt0aGlzLlNjLnB1c2goYlthXSk7dmFyIGU9bmV3IHliKGQpO3RoaXMuSShlKXx8KHRoaXMuTChlKSwobmV3IHpiKGUsdGhpcy5BKSkuYigpKX1jYXRjaChoKXt9fX10aGlzLkgoKX0scWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuWnx8KHRoaXMuWj17fSk7dGhpcy5aW2JdfHwodGhpcy5aW2JdPXt9KTt0aGlzLlpbYl1bYV18fCh0aGlzLlpbYl1bYV09W10pO3RoaXMuWltiXVthXS5wdXNoKGMpfSxidDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMuWHIoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSwKQ3A6ZnVuY3Rpb24oKXtpZih0aGlzLiRiKWZvcih2YXIgYj0wO2I8dGhpcy4kYi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLiRiW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5aW2NdW2RdJiYwPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ0KGIpfX0pfSkoYyk7dmFyIEFiPWMuVmt8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaj0KdGhpcy5hWzNdO3RoaXMub3U9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5taD1iO2IucHJvdG90eXBlPXtFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm91OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgQmI9Yy5taHx8QmIsZWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRWooNCk7KGZ1bmN0aW9uKGMpe2MuZ2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0samI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLmdofHxDYjsoZnVuY3Rpb24oYyl7Yy5oaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkNyfHwodGhpcy5Dcj0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5oaHx8RGI7KGZ1bmN0aW9uKGMpe2MuaWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgQ2IoZCk7dGhpcy5JKGYpfHwodGhpcy5MKGYpLChuZXcgRGIoZix0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5IKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5paHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maj10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbMTBdO3RoaXMuYmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbM119Yy5Fbz1iO2IucHJvdG90eXBlPXtLajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTGo6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlpuOnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaDp0aGlzLmFqKGEpfSxhajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYj1jLkVvfHxHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC5Laig0KTsKKGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLnlsfHxIYjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy5ab3x8KHRoaXMuQWYoKSx0aGlzLlpvPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLkxlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5MZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLAo1MDApKX0sY3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jcCgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5vKCksdGhpcy5sKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZigpfS5iaW5kKHRoaXMpLDUwKX0sT3U6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBJYj1jLnhsfHxJYjsoZnVuY3Rpb24oYyl7Yy56bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5MKGMpLChuZXcgSWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEpiPWMuemx8fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy5RcD10aGlzLmFbN107dGhpcy5SbD10aGlzLmFbN107dGhpcy5VcD10aGlzLmFbMTBdOwp0aGlzLiRrPXRoaXMuYVs1XTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuVmc9YjtiLnByb3RvdHlwZT17Um06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNtOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcDp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmw6dGhpcy5UcChhKX0sVHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlVwOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kazp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLlZnfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9Z2QuUm0oNCk7KGZ1bmN0aW9uKGMpe2MuaGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYoMCx0aGlzLkopKCEwKX0uYmluZCh0aGlzKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTsKdmFyIE1iPWMuaGp8fE1iOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZ20oKX0uYmluZCh0aGlzKSksdGhpcy5KZz0hMSx0aGlzLlN0PQoxRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLlN0KSl9LGdtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTsKYltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy5nanx8TmI7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8CndpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpO3ZhciBPYj1jLmlqfHxPYixQYj1uZXcgT2IocSk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs5XTt0aGlzLmxxPXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVsxMF07dGhpcy5KaD10aGlzLmFbN107dGhpcy5PcD10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52aDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy54aChhKX0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnloOnRoaXMuSWgoYSl9LEloOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLlNxfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTmt8fFJiOyhmdW5jdGlvbihjKXtjLk1rPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLkdkKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLAoxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLk1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5Paz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmCiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIFRiPWMuT2t8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbMTBdO3RoaXMuSmk9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy4kcj1iO2IucHJvdG90eXBlPXtFaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmk6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkppOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5QbTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOgphfX19KShjKTt2YXIgVmI9Yy4kcnx8VmIsaWQ9bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aWQuRWkoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuV2Q9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkZyKCl9LmJpbmQodGhpcyksNTAwKX0sRnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJgpiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2QmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuV2QpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwKInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sSHM6ZnVuY3Rpb24oKXt0aGlzLldkPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgV2I9Yy5Fa3x8V2I7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLktiPTB9LGI6ZnVuY3Rpb24oKXt0aGlzLk5xPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMuS2J8fHRoaXMuS2IrKyx0aGlzLktiPD10aGlzLk5xPyh0aGlzLktiKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IcygpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgWGI9Yy5Ea3x8WGI7KGZ1bmN0aW9uKGMpe2MuRms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IFdiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFhiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgWWI9Yy5Ga3x8WWIsWmI9bmV3IFliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLkRpPXRoaXMuYVs5XTt0aGlzLlFzPXRoaXMuYVsxMF07dGhpcy4kaj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkJoPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nbjp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVGg6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOgp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgJGI9Yy5CaHx8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuZm4oNCk7KGZ1bmN0aW9uKGMpe2Muems9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5PKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlIoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLkooKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy56a3x8YWM7KGZ1bmN0aW9uKGMpe2MueWs9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkNhKCk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkljKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5CcSgpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxObjpmdW5jdGlvbigpe3RoaXMuRmUoKXx8dGhpcy5vKCEwKX0sQnE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5JYygpOyFiLm1hJiZiLmJhJiZiLnR1JiZiLnZ1JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkNhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10uaWQ9PQphKXJldHVybiBiW2NdO3JldHVybnt9fSxHZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxvOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5JYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLnlrfHxiYzsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSlmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IGJjKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBjYz1jLkFrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzFdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMud3E9dGhpcy5hWzldO3RoaXMubGg9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ibz1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR2g6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNrOnRoaXMuQ2goYSl9LENoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EaDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3E6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMuYm98fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWtkLkZoKDQpOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuTyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5SKGEpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sSzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQ2E6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmCih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVD1jLnJqfHxUOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlhkPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGQ9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5YZCYmYiE9dGhpcy5YZHx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKGsuYWRUYWc9YS5hZFVSTCksdGhpcy5sKCJhZGVycm9yIixhLlN1KSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVPWMucWp8fFU7KGZ1bmN0aW9uKGMpe2Muc2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEQpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgVChiKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgVShiLHRoaXMuQSksYi5iKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFQoYiksYi5qYT90aGlzLmNnKCk6dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBELGZjPWMuc2p8fGZjLGdjPW5ldyBmYyhmdW5jdGlvbihjLGIpe2MucGF1c2UoKTtpZihtLm5iLmxlbmd0aCl7dmFyIGE9bS5uYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9Zi5wcyh7IltMT0FEU0NSSVBUXSI6Zi5wYSgxMCksIltVVElMU10iOmYucGEoMTApLCJbQ0FMTEJBQ0tdIjpmLnBhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09Zi5NZi5iaW5kKGYpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKWtbZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWYuTWYoZywKZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obz10aGlzLmFbNV07dGhpcy5Fcz10aGlzLmFbOV07dGhpcy5tbz10aGlzLmFbMV07dGhpcy56aj10aGlzLmFbM107dGhpcy5pbz10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbOF07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbM107dGhpcy5maj10aGlzLmFbMl07dGhpcy5nPXRoaXMuYVsyXX1jLnRpPWI7Yi5wcm90b3R5cGU9e01vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Obzp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRXM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5tbzp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Jazp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBsOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhjPWMudGl8fGhjLGxkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLk1vKDQpOyhmdW5jdGlvbihjKXtjLmdsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuTyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlIoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlRxPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxnczpmdW5jdGlvbihiKXt0aGlzLm5kPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UcX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sSzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJih0aGlzLkomJnRoaXMuSigpLHRoaXMubmQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm5kJiYobmV3IEcodGhpcyx0aGlzLm5kKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuZ2x8fE07KGZ1bmN0aW9uKGMpe2MuZmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5BZClpZih0aGlzLmdifHwodGhpcy5nYj0wKSx0aGlzLmdiKyssMTU8dGhpcy5nYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHRoaXMucnMoKSwhMDt0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm8oKTp0aGlzLm8oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEc9Yy5mbHx8RzsoZnVuY3Rpb24oYyl7Yy5obD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy53YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYi5ncyh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgaWM9Yy5obHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm11PXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMudG89YjtiLnByb3RvdHlwZT17bHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm11OnRoaXMubW4oYSl9LG1uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMudG98fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5sdSg0KTsoZnVuY3Rpb24oYyl7Yy5vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5VZT0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5SKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSwKe2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3JuOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuVWU9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3JuOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5vanx8bGM7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sV3U6ZnVuY3Rpb24oKXt9LFJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWUobmV3IGZ1bmN0aW9uKCl7fSk7YS5xdT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5ScihhKTsKd2luZG93Lnl1PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLlFyfHwodGhpcy5Rcj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRkfHwodGhpcy5EZD0xKTtpZigyMDx0aGlzLkRkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5EZCsrOwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmCmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuVyghMCl9LmJpbmQodGhpcykpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMubmp8fG1jOyhmdW5jdGlvbihjKXtjLnBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgbmM9Yy5wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmpuPXRoaXMuYVs0XTt0aGlzLnRtPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzhdfWMuRWg9YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbjp0aGlzLnNtKGEpfSwKc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgcGM9Yy5FaHx8cGMsbmQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bmQuTW0oNCk7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKTthJiZ0aGlzLk8oYS5wYXJlbnROb2RlKX0sSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFY9Yy5sanx8VjsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy53Zj0wO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT10aGlzLlhiPXRoaXMuVmE9dGhpcy5xYz0hMTt0aGlzLmFnPWYua2IoMTApO3RoaXMuRmYoKX0sRmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm8oITApOnRoaXMubygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmYuYmluZCh0aGlzKSwxMDApLCExfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSwKdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBXPWMua2p8fFc7KGZ1bmN0aW9uKGMpe2MubWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFYod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7CmVsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBWKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIHFjPWMubWp8fHFjLHJjPW5ldyBxYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VZz10aGlzLmFbNF07dGhpcy5waD10aGlzLmFbNV07dGhpcy5sbD10aGlzLmFbMl07dGhpcy5Eaj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs1XX1jLmtpPWI7Yi5wcm90b3R5cGU9e1RnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VZzp0aGlzLm9oKGEpfSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucGg6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sbDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGo6dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVpOnRoaXMuUW8oYSl9LFFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Sbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMua2l8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLlRnKDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLk8oYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5RaHx8dGM7KGZ1bmN0aW9uKGMpe2MuUGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsCmZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5vKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5QaHx8dWM7KGZ1bmN0aW9uKGMpe2MuUmg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGYuRGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkkoZCl8fCh0aGlzLkwoZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkgoKX19KX0pKGMpO3ZhciB2Yz1jLlJofHx2Yyx3Yz1uZXcgdmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJsPXRoaXMuYVsxMF07dGhpcy54az10aGlzLmFbM107dGhpcy5XbT10aGlzLmFbM107dGhpcy5jbj10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbM107dGhpcy50bj10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLnZyPWI7Yi5wcm90b3R5cGU9e0FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CbDp0aGlzLndrKGEpfSx3azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGs6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldtOnRoaXMuYm4oYSl9LGJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jbjp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua2s6dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRuOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgeGM9Yy52cnx8eGMscGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuJGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLk8oYiksdGhpcy5SKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHljPWMuJGh8fHljOyhmdW5jdGlvbihjKXtjLlpoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlBlKCl9LFBlOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5aaHx8emM7KGZ1bmN0aW9uKGMpe2MuYWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5qYSl7dGhpcy5IKCk7cmV0dXJufWlmKCF0aGlzLkkoYikpe3RoaXMuTChiKTsobmV3IHpjKGIsdGhpcy5BKSkuYigpO3RoaXMuSCgpO3JldHVybn19dGhpcy5IKCl9fSl9KShjKTt2YXIgQWM9Yy5haXx8QWMsQmM9bmV3IEFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsyXTt0aGlzLkNzPXRoaXMuYVsxXTt0aGlzLnRrPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVsxMF07dGhpcy5laz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs5XX1jLmpxPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IaTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRrOnRoaXMuY3IoYSl9LGNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuZHI6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5qcXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGY9dGhpcy5LZj10aGlzLkpmPSExO3RoaXMuVWM9W107dGhpcy4kZD17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcmM/bnVsbDpyYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBGYj9udWxsOkZiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFViP251bGw6VWIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHdiPwpudWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB4YT9udWxsOnhhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE1hP251bGw6TWEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgbmE/bnVsbDpuYX19Yy5waz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnJwKGEpOltdLGI7dGhpcy5LZj0hMDtpZihhLmxlbmd0aCl7dGhpcy5KZj0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPQphW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxycDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZFtjXSx0aGlzLm9lKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEpe3RoaXMub2UoYSkmJmEuYigpfSxKczpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuSmYpZm9yKHRoaXMuSGY9ITAsYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXRoaXMuVWNbYV0ucWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5VY1thXS5xYil9fX0pKGMpO3ZhciBEYz1jLnBrfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Q9dGhpcy5hWzRdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMV19Yy53bD1iO2IucHJvdG90eXBlPXtWdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3Q6dGhpcy5pdShhKX0saXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmp1OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qbDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEVjPWMud2x8fEVjLHJkPW5ldyBFYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLlZ0KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZi5UYihsLnd0KSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5UYihsLldxKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxiYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRj1uZXcgZ2Esaz0hMTtGLk1jKCk7Ri5CZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuTWMoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkJmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5NYygpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2YuZmlyZUV2ZW50KHdpbmRvdyxGLlhwKCkse2lkOnRkfSl9LDUwMCk7YWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bz10aGlzLmFbMV07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMueXM9dGhpcy5hWzEwXTt0aGlzLkpqPXRoaXMuYVsyXTsKdGhpcy5vdD10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzEwXTt0aGlzLklvPXRoaXMuYVsxXTt0aGlzLm5sPXRoaXMuYVs0XTt0aGlzLmFwPXRoaXMuYVs0XTt0aGlzLmRqPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzZdfWMuTWo9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZvOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5mdTp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Kajp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3Q6dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJqOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6CnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hcDp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLk1qfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC51byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmY9dGhpcy5jb25mPXRoaXMuVWE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLlBjPTA7dGhpcy5MYT0iIjt0aGlzLlZjPVtdO3RoaXMuV2M9MDt0aGlzLiRmPSExO3RoaXMuWWQ9W119Yy5MZz1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXt0aGlzLlpmPWF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGpzOmZ1bmN0aW9uKGEpe3RoaXMuVWE9YX0saHM6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5MYV0mJnRoaXMuY29uZlt0aGlzLkxhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTGFdW2FdKTtyZXR1cm4gYn0sYmM6ZnVuY3Rpb24oYSxiKXtmLmliKCJ3ZWx0LmRlIikmJmYuWGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpOwp2YXIgYz0hMSxlPSExO2lmKHRoaXMuWXAoKSl0aGlzLlVhLmModGhpcy5VYS5KYyx0aGlzLlVhLnphLHRoaXMuVWEuWmQsZnVuY3Rpb24oKXt0aGlzLmJjKGEsYil9LmJpbmQodGhpcyksdGhpcy5VYS5CYyk7ZWxzZSBpZih0aGlzLkVwKCkpdGhpcy5jcyhmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YuRChsLnljLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkxzKCk7ay5leGl0RnVsbHNjcmVlbigpO1E9az1uZXcgTyhrLHRoaXMuVWEsaCk7ay5nZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5LcShhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpOwpoLmFkU3RhcnRUaW1lb3V0JiYoZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5KZChhLGMsZSk7dGhpcy5wbGF5ZXIuaGcoayl9fSxZcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlBjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuUGMuZ2V0VGltZSgpLHRoaXMuUGM9YSwzRTU8Yj8hMDohMTt0aGlzLlBjPWE7cmV0dXJuITF9LEFzOmZ1bmN0aW9uKCl7Zi5lZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmFmKGEpKT90aGlzLmJjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfSx6czpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLm9zKCEwKTsKdmFyIGI9dGhpcy5jb25mLGM9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5hZihjKSk/dGhpcy5iYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9fSxhZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sVHI6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50cyh0aGlzLnpzLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmVhKCl9LCRjOmZ1bmN0aW9uKGEpe2YuZWUoIm1pZHJvbGwiKTtpZighdGhpcy5PZil7dGhpcy5PZj0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuYmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2Y9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LFNyOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIubnModGhpcy4kYy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5BcygpO3RoaXMucGxheWVyLk5kJiZ0aGlzLlNyKCk7dGhpcy5UcigpfSxVcjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLlZjLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5rdShhLGIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlciwKYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLldjPXRoaXMuVmMubGVuZ3RofSxFcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5XYyYmKGE9ITApO3JldHVybiBhfSxjczpmdW5jdGlvbihhKXt0aGlzLiRmPWE7Zm9yKGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl0aGlzLlZjW2FdWyJmdW5jdGlvbiJdKHRoaXMuSXIuYmluZCh0aGlzKSl9LElyOmZ1bmN0aW9uKGEpe3RoaXMuV2MtLTthJiZ0aGlzLllkLnB1c2goYSk7MD49dGhpcy5XYyYmdGhpcy4kZigpfSxLcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5ZZC5sZW5ndGg7YysrKWI9dGhpcy5ZZFtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZGE9Yy5MZ3x8ZGEsUT0hMSxqYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaD10aGlzLmFbN107CnRoaXMuWGc9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMucG49YjtiLnByb3RvdHlwZT17emg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFoOnRoaXMuV2coYSl9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdjPWMucG58fEdjLHZkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnpoKDQpfSkuY2FsbChWb3B1V3VpdlhhaExpb1llLFZvcHVXdWl2WGFoTGlvWWUpOwo=
Protocol
HTTP/1.1
Server
54.230.44.222 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-44-222.fra6.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Wed, 11 Jul 2018 13:53:28 GMT
Via
1.1 6fd049110ebc3ac6deddab8b0bf5d686.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
11
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
53
Last-Modified
Wed, 11 Jul 2018 13:52:59 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
bGK-eJ7HaiHA16K_jidpppnXjzCY0lVrFrn8iIoHZKHdoNSCVqu6gA==
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=1781215031
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvcHVXdWl2WGFoTGlvWWU9Vm9wdVd1aXZYYWhMaW9ZZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWGEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLmpzKG0pLGEuaHMoayksYS5VcigpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2o9dGhpcy5hWzFdO3RoaXMuUmc9dGhpcy5hWzZdO3RoaXMuUGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNF19Yy5OZz0KYjtiLnByb3RvdHlwZT17Tmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9qOnRoaXMuUWcoYSl9LFFnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SZzp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYT1jLk5nfHxlYSxIYz1uZXcgZWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1IYy5Oaig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5FYT0ic2V0dXAiO3RoaXMuZGM9W107dGhpcy5TZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkhyLmJpbmQodGhpcykpfWMubmk9YjtiLnByb3RvdHlwZT17U2U6ZnVuY3Rpb24oKXt0aGlzLmxhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LG9tOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YS5wb3N0TWVzc2FnZShiLCIqIil9LEdhOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxIcjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5HcihhLmRhdGEpfSxHcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMubGEuZXZlbnRsaXN0ZW5lci5sZW5ndGg7YisrKWEuZXZlbnQ9PQp0aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSxyZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxtbTpmdW5jdGlvbihhLGIpezA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sYmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7Zm9yKHZhciBkPTA7ZDx0aGlzLmxhLmVycm1zZy5sZW5ndGg7ZCsrKWIrPSJcbiIrdGhpcy5sYS5lcnJtc2dbZF07dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxEYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT0KdHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxoZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSXM6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sRGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9MCxjPTAsaD0wLGY9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7ZT11LmhlaWdodDswPnUudG9wJiYoZSs9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZS09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYKKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5lJiYoZT0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCplKTtoPj1iJiYoZj0hMCk7cmV0dXJuIGZ9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSwKQmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGU7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZT1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitlLGJ8PTA7cmV0dXJuIGJ9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGcrPWUudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxjLGg9QXJyYXkoODApLGY9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZT0wO2U8bi0zO2UrPTQpYz1hLmNoYXJDb2RlQXQoZSk8PDI0fGEuY2hhckNvZGVBdChlKzEpPDwxNnxhLmNoYXJDb2RlQXQoZSsyKTw8OHxhLmNoYXJDb2RlQXQoZSszKSwKcC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGUpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKyloW2VdPXBbYStlXTtmb3IoZT0xNjs3OT49ZTtlKyspaFtlXT1kKGhbZS0zXV5oW2UtOF1eaFtlLTE0XV5oW2UtMTZdLDEpO2M9ZjtuPXU7bD1rO3c9STtxPW07Zm9yKGU9MDsxOT49ZTtlKyspcj1kKGMsNSkrKG4mbHx+biZ3KStxK2hbZV0rMTUxODUwMDI0OSYKNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTIwOzM5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT00MDs1OT49ZTtlKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXI9ZChjLDUpKyhuXmxedykrcStoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2Y9ZitjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihmKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx3YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxlLGMsaCxmLHUsaz0wO2s8YS5sZW5ndGg7KWQ9CmEuY2hhckNvZGVBdChrKyspLGU9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LGY9KGUmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGUpP2Y9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sZ3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZT0hMSxjPSExLGg9ITEsZj0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtlPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRtPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGY9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1lO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1mO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxlcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuV2UoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxXYTpmdW5jdGlvbigpe3ZhciBhPXtZZzpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKamg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sWWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFltOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWcoKXx8YS5qaCgpfHxhLkdwKCl8fGEuWWooKXx8YS5DbCgpfX07cmV0dXJuIGEuWW0oKX0sS2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbYltlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGU9MCxjPWEubGVuZ3RoO2U8YzsrK2UpYi5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxiW2FbZV1dPTEpO3JldHVybiBkfSxvZjpmdW5jdGlvbihhKXthPXRoaXMuS2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSwkbjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxlPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8ZS5wdXNoKGFbY10pO3JldHVybiBlfSxGczpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGU9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZT1hLnNwbGl0KCIlIiksZD1iLzEwMCplKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGVmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54ZyhiKSsiOiIrdGhpcy54ZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZTpmdW5jdGlvbihhKXt0aGlzLkVhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU7ZC5zdGF0ZT10aGlzLkVhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2U9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGUpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxlLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5GYyhiLGQpKTtiJiYoaD1sLkZjKGEsYikpO2UmJihoPWwuRmMoaCxlKSk7YyYmKGg9bC5GYyhoLGMpKTtmLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBlPW0uYWUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uVGEoZSwhMCk7ZT1tLlRhKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRmEoZSxmdW5jdGlvbihkKXt2YXIgZT0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZT0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZT0hMSl9Y2F0Y2goYyl7fWV8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLAooZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oKXttJiZtLlk/bS5pc0VuYWJsZWQmJm0ueG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2QoKX0uYmluZCh0aGlzKSw1MDApfSxxbjpmdW5jdGlvbihhLGIpe2lmKGIuT2MoYSl8fCJhYm91dDpibGFuayI9PWF8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLmJmKGEpKXJldHVybiB0aGlzLmJmKGEpO3ZhciBkPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2QuaG9tYWRfdXJsX3N1ZmZpeD0KYTtkLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoYSk7ZC5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2QuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt2YXIgZT0hMSxjPSExLGM9dGhpcy5YYShhLGIudWEsZCxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWMpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMubW0oZSxhKTtyZXR1cm4gZX0sWGE6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZix1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suVGEoYSxoKTtoPWsuVGEoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5GYShoLGUsYywiIiwiIixmKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoYSxiLGQsZSxjLGssZix1KX0uYmluZCh0aGlzKSw1MDApfSxGcTpmdW5jdGlvbihhLGIsZCxlLGMsaCxmKXt2YXIgdT0hMDtmJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtmPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZilkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGZba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZShsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sR3E6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRnEoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZGMpZm9yKHZhciBjIGluIHRoaXMuZGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5kY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2Yud2IoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTWY6ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5YYShhLGUudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkdxKGUuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZSwhMCl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRjPWF9LGt1OmZ1bmN0aW9uKGEsYixkLGUsYyl7dGhpcy5YYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmV9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX0pfSxabTpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LGJxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLm5pfHxQO25ldyBQO3ZhciBmPW5ldyBQO3dpbmRvdy5CdT1mOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1pPWI7Yi5GYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGU7Zm9yKGUgaW4gYilkW2VdPWJbZV07Zm9yKGUgaW4gYSlkW2VdPWFbZV07cmV0dXJuIGR9O2IudXI9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnE9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ0PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuSm89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZtPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLiRsPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5jbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5obT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWmw9e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLmFtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuenQ9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVxPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLktvPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdT17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Mbj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlFuPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuemM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuZW09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5JZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuSGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuaW09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5ibT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iud3Q9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5XcT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMubWl8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHI9dGhpcy5hWzVdO3RoaXMuQXE9dGhpcy5hWzRdO3RoaXMuS249dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19CmMudXE9YjtiLnByb3RvdHlwZT17b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnByOnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5BcTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgZmE9Yy51cXx8ZmEsSmM9bmV3IGZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMub3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5vaT1iO2IucHJvdG90eXBlPXtCZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZSxjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBNYXRoLmFicyhiKX0sCmViOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxtcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxHYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTsKaWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxNYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5HYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYygpKyIyIn0sQmY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLm1wKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09CmIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5vaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueHI9dGhpcy5hWzhdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMuS2s9dGhpcy5hWzRdO3RoaXMudm09dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzVdO3RoaXMuZHQ9dGhpcy5hWzddO3RoaXMubnE9dGhpcy5hWzVdO3RoaXMuQmk9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbN119Yy5VaD1iO2IucHJvdG90eXBlPXt3cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueHI6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ0OnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lazp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudm06dGhpcy5hcyhhKX0sYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5iczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZHQ6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5xOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhhPWMuVWh8fGhhLEtjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLndyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGU9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZVtjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGdbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5pO3RoaXMuaT1kW2FdO3ZhciBlPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaT1nO3JldHVybiBlfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBlLmM/ZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2UuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1lO2UuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51ZT1ifSkoYyk7dmFyIEo9Yy51ZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbOF07dGhpcy54aT10aGlzLmFbOF07dGhpcy5ycj10aGlzLmFbNl07dGhpcy5odD0KdGhpcy5hWzNdO3RoaXMuVG89dGhpcy5hWzEwXTt0aGlzLllxPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuR3M9YjtiLnByb3RvdHlwZT17TWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5pOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGk6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJyOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odDp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVG86dGhpcy5YcShhKX0sWHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLkdzfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuTWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5vaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5rcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGtzOmZ1bmN0aW9uKGIpe3RoaXMuQT0KYn0sbHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxMOmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5lYigpXT1iO0smJksuS2YmJksuSnMoYil9LEp1OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmViKCldPyEwOiExfSxmcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFh1OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMub2t8fHI7KGZ1bmN0aW9uKGMpe2MucWs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9Cm51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuZmI9IiI7dGhpcy5ZZT0hMTt0aGlzLk4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSx0czpmdW5jdGlvbihiKXt0aGlzLko9Yn0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxuczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LEl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LAppc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxZdTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcCgpfHx0aGlzLmptKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEx1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGptOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPwohMDohMX0sTzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxDYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxoYjpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmZiPQpifSxIdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZifSxXcjpmdW5jdGlvbigpe3RoaXMuZmI9bnVsbH0sTnU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmZiJiYoYj0hMCk7cmV0dXJuIGJ9LFR1OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxFdTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5xa3x8cDsoZnVuY3Rpb24oYyl7Yy5NZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLlZsPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuS2U9dGhpcy5CZz0hMTt0aGlzLnN0YXR1cz10aGlzLmljO3RoaXMuaWQ9Zi5wYSgxMCk7dGhpcy5ZYyhiKTt0aGlzLmxzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLnFzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy50YiYmMDx0aGlzLnRiLmxlbmd0aCYmKHRoaXMudGI9Zi51bmlxdWUodGhpcy50YiksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sTXU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LHFzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuRWV9LHJzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5WbH0sQ2I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGxzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxscDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEpxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5NZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hbz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLlNnPWI7Yi5wcm90b3R5cGU9CntGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlNnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Gbyg0KTsoZnVuY3Rpb24oYyl7Yy5yaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LApwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLnJofHxSOyhmdW5jdGlvbihjKXtjLnFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuR3Q9MUUzO3RoaXMuV2Y9bnVsbDt0aGlzLml0PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy4kbSliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLllvLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5CcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLkFwKGEsCmIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuSnQoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLkt0KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuenAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sT246ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxKdDpmdW5jdGlvbihiKXt0aGlzLmdkfHwodGhpcy5nZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTHQoYil9LmJpbmQodGhpcyksdGhpcy5HdCkpfSxMdDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCk7dGhpcy53KCl9LEt0OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdkKX0sCnpwOmZ1bmN0aW9uKGIpe3RoaXMuenUoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuRHI8dGhpcy5pdD90aGlzLncoKTp0aGlzLm0oKX0sQnA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxZbzpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXt0aGlzLkRyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMucWh8fGxhOyhmdW5jdGlvbihjKXtjLnNoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGYuRGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgUihiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBsYShnLAp0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5zaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs3XTt0aGlzLkptPXRoaXMuYVs0XTt0aGlzLnJtPXRoaXMuYVs4XTt0aGlzLlVtPXRoaXMuYVs4XTt0aGlzLlNzPXRoaXMuYVsxXTt0aGlzLkRuPXRoaXMuYVs0XTt0aGlzLll0PXRoaXMuYVs1XTt0aGlzLnJsPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuSW49YjtiLnByb3RvdHlwZT17Ums6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNrOnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KbTp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm06dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMuUnMoYSl9LApSczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3M6dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRuOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5Jbnx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMuUmsoNCk7KGZ1bmN0aW9uKGMpe2MuWmk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT0KYi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSx0aGlzLmVxPSEwKTt0aGlzLlIoYSk7dGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmVxKXt0aGlzLmNxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksCjUwKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT0KYi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxoYjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7CnZhciBwYT1jLlppfHxwYTsoZnVuY3Rpb24oYyl7Yy5ZaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5hYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYWI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJgoodGhpcy5DYigpLHRoaXMuZ2V0UGxheWVyKCkuUG49ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmZiO2EmJihhLlRkKCksYS5BYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTsKaWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlBmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToKKHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm1jLmxlbmd0aD49dGhpcy5wZCYmdGhpcy5vKCkpfSxKcTpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtmLklzKGEudmlkZW9UYWcpJiYoYS5jcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLllpfHxxYTsoZnVuY3Rpb24oYyl7Yy4kaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmlwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYKIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHBhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5JKGcpfHx0aGlzLmZxKGcpfHwodGhpcy5MKGcpLGc9bmV3IHFhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGlwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy4kaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1rPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs5XTt0aGlzLlNwPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy5IcD1iO2IucHJvdG90eXBlPQp7bGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56aTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB0YT1jLkhwfHx0YSxPYz1uZXcgdGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1PYy5sayg0KTsoZnVuY3Rpb24oYyl7Yy5HbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLk8oYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlIoYik6dGhpcy5IKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTt2YXIgdWE9Yy5HbHx8dWE7KGZ1bmN0aW9uKGMpe2MuRmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHZhPWMuRmx8fHZhOyhmdW5jdGlvbihjKXtjLkhsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYwPGYuRGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9Cm5ldyB1YShnKSx0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyB2YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19KX0pKGMpO3ZhciB3YT1jLkhsfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGc9dGhpcy5hWzldO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzVdO3RoaXMudXQ9dGhpcy5hWzNdO3RoaXMuT2g9dGhpcy5hWzRdO3RoaXMuc289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5IbT1iO2IucHJvdG90eXBlPXtPZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUGc6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kcTp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnV0OnRoaXMuTmgoYSl9LE5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PaDp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB5YT1jLkhtfHx5YSxQYz1uZXcgeWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5PZyg0KTsoZnVuY3Rpb24oYyl7Yy51bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5PKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmI/dGhpcy5SKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5KJiZ0aGlzLkooKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/CmIuYXV0b3BsYXkoKTohMX0samI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLnVsfHx6YTsoZnVuY3Rpb24oYyl7Yy50bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMudW4oKTsKdGhpcy5IYSgpfSxVdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFZiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj0KdGhpcy5TYSgpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLlhiPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlhifSxhcTpmdW5jdGlvbigpe2lmKCF0aGlzLnhmKXt2YXIgYj10aGlzLlNhKCksYT10aGlzLlpwKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LFpwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuV2EoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5XKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sRnU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSx1bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8CmIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFxKCkpe3ZhciBhPXRoaXMuU2EoKSxnPXRoaXMuVmIoKTthJiZnJiYodGhpcy5TYSgpLHRoaXMuVmIoKSx0aGlzLnRkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGQ/dGhpcy5tKCk6KHRoaXMuVyghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuU2EoKX1lbHNlIHRoaXMueWY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fAp0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2bjpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/Cih0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLnpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLnpnLGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxBbjpmdW5jdGlvbigpe3RoaXMuUHV8fCgxMDx0aGlzLkh0Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5IdCsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLlZyKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTApKSl9LFZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5JdCl7dGhpcy5JdD0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQWE9Yy50bHx8QWE7KGZ1bmN0aW9uKGMpe2Mudmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPApmLkRhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IHphKGJbZ10pLGEuamF8fHRoaXMuSShhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgQWEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSDpmdW5jdGlvbigpe3RoaXMucWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5hYyl9fSl9KShjKTt2YXIgQmE9Yy52bHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZpPXRoaXMuYVszXTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLnN0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuZ3I9YjtiLnByb3RvdHlwZT17dWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZpOnRoaXMuSnIoYSl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuS3I6dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5ncnx8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMudWkoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5PKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGhiOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMuWGt8fEVhOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoITApOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy53KCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5tKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWMuYmluZCh0aGlzKSwxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksCnRoaXMubSgpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLnpiJiYodGhpcy56Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWN8fCh0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpOwpiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuZWM9ITAsdGhpcy5tKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMuV2t8fEZhOyhmdW5jdGlvbihjKXtjLllrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmCnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgRWEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEZhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBHYT1jLllrfHxHYSxIYT1uZXcgR2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzRdO3RoaXMudms9dGhpcy5hWzJdO3RoaXMuaHU9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzldO3RoaXMudHI9dGhpcy5hWzNdO3RoaXMucHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbM119Yy5mbz1iO2IucHJvdG90eXBlPXtVbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVm86dGhpcy51ayhhKX0sdWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZrOgp0aGlzLmd1KGEpfSxndTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaHU6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhqOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy50cjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5mb3x8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuVW8oNCk7KGZ1bmN0aW9uKGMpe2MuYmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlOwp0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy5iaHx8SmE7KGZ1bmN0aW9uKGMpe2MuYWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTsKYi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMuYWh8fEthOyhmdW5jdGlvbihjKXtjLmRoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLApkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBKYShkLGEpLHRoaXMuSShkKXx8KGQuTGQoYSksdGhpcy5MKGQpLGQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy5kaHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVsyXX1jLmpqPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54bzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIE5hPWMuamp8fE5hLFNjPW5ldyBOYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53byg0KTsoZnVuY3Rpb24oYyl7Yy51aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5PKGIpO3RoaXMuUihiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJgowPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBPYT1jLnVqfHxPYTsoZnVuY3Rpb24oYyl7Yy50aj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5XYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5sYygpfSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD8KYi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFBhPWMudGp8fFBhOyhmdW5jdGlvbihjKXtjLnZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgT2EoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBQYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgUWE9Yy52anx8UWEsUmE9bmV3IFFhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzRdfQpjLmFuPWI7Yi5wcm90b3R5cGU9e2tuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIFNhPWMuYW58fFNhLFRjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLmtuKDQpOyhmdW5jdGlvbihjKXtjLmJrPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuVWQ9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmRhKCk7cmV0dXJufXRoaXMuTyhhKTsKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUihiKTp0aGlzLmRhKCl9LEVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmIsZz10aGlzLmViKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLlRkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5VZD0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LGpiOmZ1bmN0aW9uKCl7dGhpcy5VZCsrOwppZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sSzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZWE6ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9fSl9KShjKTsKdmFyIFRhPWMuYmt8fFRhOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5nYnx8KHRoaXMuZ2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5nYisrLDE1PHRoaXMuZ2IpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuVmEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMuV28/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsCmZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLldvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5FcihhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgVWE9Yy5ha3x8VWE7KGZ1bmN0aW9uKGMpe2MuY2s9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IFVhKGEsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBWYT1jLmNrfHxWYSxXYT1uZXcgVmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGw9dGhpcy5hWzddO3RoaXMuTG09dGhpcy5hWzVdO3RoaXMuV2g9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsyXTt0aGlzLmpyPXRoaXMuYVsxMF07dGhpcy5SaT10aGlzLmFbOF07dGhpcy5wbD10aGlzLmFbN107dGhpcy54aj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsxMF19Yy5kcz1iO2IucHJvdG90eXBlPXtTbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlRsOnRoaXMuS20oYSl9LEttOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG06dGhpcy5WaChhKX0sVmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldoOnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lbzp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuanI6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJpOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbDp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBYYT1jLmRzfHxYYSxVYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0KVWMuU2woNCk7KGZ1bmN0aW9uKGMpe2MuaWk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLk8oYi5lbGVtZW50KTt0aGlzLlIoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgWWE9Yy5paXx8WWE7KGZ1bmN0aW9uKGMpe2MuaGk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBaYT1jLmhpfHxaYTsoZnVuY3Rpb24oYyl7Yy5qaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgWWEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFphKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgJGE9Yy5qaXx8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsyXTt0aGlzLlhpPQp0aGlzLmFbMTBdO3RoaXMuV3A9dGhpcy5hWzEwXTt0aGlzLmNpPXRoaXMuYVsxXTt0aGlzLkR0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuaHI9YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pazp0aGlzLldpKGEpfSxXaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGk6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2k6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgYmI9Yy5ocnx8YmIsVmM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuaGsoNCk7CihmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0saGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sem46ZnVuY3Rpb24oKXtmLkRmKHRoaXMuRGMpO2YuRWYodGhpcy5EYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpuKCl9LmJpbmQodGhpcyksNTApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgY2I9Yy5UaXx8Y2I7KGZ1bmN0aW9uKGMpe2MuU2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGRiPWMuU2l8fGRiOyhmdW5jdGlvbihjKXtjLlVpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiYKay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBlYj1jLlVpfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQnI9dGhpcy5hWzFdO3RoaXMuem89dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzJdO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuUWs9dGhpcy5hWzldO3RoaXMuJHQ9dGhpcy5hWzJdO3RoaXMuZmg9dGhpcy5hWzVdO3RoaXMuTGk9dGhpcy5hWzEwXTt0aGlzLnltPQp0aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLndtPWI7Yi5wcm90b3R5cGU9e0FyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ccjp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem86dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZyOnRoaXMucG8oYSl9LHBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xbzp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFrOnRoaXMuWnQoYSl9LFp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJHQ6dGhpcy5laChhKX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZoOnRoaXMuS2koYSl9LEtpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaTp0aGlzLnhtKGEpfSx4bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueW06dGhpcy5EbChhKX0sRGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRWw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy53bXx8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuQXIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnBpPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sa206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5waXx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwyMDAhPWYuc3RhdHVzJiYyMDEhPWYuc3RhdHVzfHxnKGYpO2lmKGQmJjQ9PWYucmVhZHlTdGF0ZSYmMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1cylkKGYpO2Vsc2UgaWYoND09Zi5yZWFkeVN0YXRlJiYwPT1mLnN0YXR1cyYmbSYmbS5GZCh0aGlzLklhLnVybCkmJm0uZGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLm1zKCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMucmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZGYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLm5nP3RoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMSk6dGhpcy5OYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCEwKSx0aGlzLktnfHwodGhpcy5OYS53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiZtLkZkKHRoaXMuSWEudXJsKT9tLmRkP20uZ2EoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uRmQodGhpcy5JYS51cmwpLHRoaXMuVGYmJnRoaXMuVGYoKX1yZXR1cm4gdGhpcy5OYX19fSkoYyk7dmFyIGhiPWMucml8fGhiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLk9iPSIiO3RoaXMudWQ9dGhpcy5iYj1udWxsO3RoaXMuYW89dGhpcy5uYj10aGlzLkxmPSExO3RoaXMudWE9IiI7dGhpcy5HZj0hMTt0aGlzLnphPXRoaXMuSmM9IiI7dGhpcy5DZj10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5oYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSGI9IiI7dGhpcy5vYj1bXTt0aGlzLkliPVtdO3RoaXMuR2I9IiI7dGhpcy5sZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNkPSExO3RoaXMuQm49dGhpcy5lZD1udWxsO3RoaXMuZmM9dGhpcy5BZz10aGlzLm5lPXRoaXMuZGQ9dGhpcy52ZD10aGlzLmpjPSExO3RoaXMuUGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fQpjLnNpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLmFvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuR2YsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMuemEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5ZLGlzQmxvY2tlZDp0aGlzLkNmLHNlcnZlcjp0aGlzLk1hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMudGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy55ZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5rZSxIT01BRF9WRVJJRklFRDp0aGlzLnllLEhPTUFEX0JMT0NLRUQ6dGhpcy53ZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5zYiwKSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkJuLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuamMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnZkLHVzZVN0cmljdENoZWNrczp0aGlzLmRkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUGEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMuZmcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuZmN9fSxEcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYKMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxqcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1mLlptKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5PYnx8dGhpcy5iYnx8dGhpcy51ZCkmJihrPXRoaXMuUXEoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5rcChmLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LApPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxaYjpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5NYSYmdGhpcy5NYS5sZW5ndGgmJjA8dGhpcy5NYS5sZW5ndGgmJihiPXRoaXMuTWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGtwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnh1O3JldHVybiJub25lIn0sTGM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYVt0aGlzLmZnXX0sYWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLmpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LFFxOmZ1bmN0aW9uKGEpe3RoaXMuT2ImJgooYSs9dGhpcy5PYik7aWYodGhpcy5iYilmb3IodmFyIGIgaW4gdGhpcy5iYil0aGlzLmJiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmJiW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj1oO3RoaXMuRXEoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuemEpdGhpcy5DcSgpO2Vsc2UgdHJ5e3RoaXMuemE9YigpLHRoaXMud2MoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEVxOmZ1bmN0aW9uKCl7dGhpcy5GYShuZXcgeih0aGlzLkpjK3RoaXMub2MoImdsb2JhbCIpKSwKdGhpcy55cC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxDcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnZkKXt0aGlzLnZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwppZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMud2UpKTt0aGlzLnJiKCk7Zi5UYihsLnVyKTsoYj1mLm9mKHRoaXMuTGMoKSkpfHwoYj1mLm9mKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx5cDpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDsKdGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuemF9ZWxzZSBhPXRoaXMuemE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5NYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMudGY9YS5hZHBhdGh8fCIiO3RoaXMueWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5mZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5NYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiYKdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5hZSgpKSxjPXRoaXMuS2EodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMub2MoImN1c3RvbWVyIikpO3RoaXMuRmEoYix0aGlzLk1zLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNlKCJjdXN0b21lciIpO2E/dGhpcy5Haz90aGlzLmdhKCJub1NWTUNvbmZpZyIpOgoodGhpcy5Haz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LE1zOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLm5lPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuQWc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLm9iPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5zcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMueWQmJih0aGlzLkdiPW51bGwpO3RoaXMubGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5DZCYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuQ2Q9ITAsdGhpcy5RYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5mdCgpJiYodGhpcy5IYnx8dGhpcy5JYnx8dGhpcy5vYnx8dGhpcy5HYik/dGhpcy5aZD8odGhpcy5vYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuc2IpKSwKdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5WcygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLldzKCkpfX0sVnM6ZnVuY3Rpb24oKXt0aGlzLlVzKCl9LFdzOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYShhKSksdGhpcy5yYigpLHRoaXMud2QoKSl9LFVzOmZ1bmN0aW9uKCl7aWYodGhpcy5IYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5xZygpfWVsc2UgdGhpcy5xZygpfSxwZzpmdW5jdGlvbigpe3ZhciBlO3ZhciBjO2Z1bmN0aW9uIGEoKXtlPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlpzKGUsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5pZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuY2QodGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfXRoaXMub2I9bnVsbCx0aGlzLmllKCl9LFpzOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7ZigpJiYKYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy4kcyhlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuSWImJnRoaXMuSWIubGVuZ3RoKXt2YXIgYz10aGlzLkliLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGcoKX0sJHM6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoKXtoKCkmJmIoKX1mdW5jdGlvbiBmKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7bC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtsLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2wub25sb2FkPWU7bC5vbmVycm9yPWY7bC5zcmM9YTtsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChtKXtlKCl9fSxpZTpmdW5jdGlvbigpe3RoaXMuR2I/KHRoaXMua2UrKyx0aGlzLkZhKG5ldyB6KHRoaXMuR2IpLHRoaXMuVHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuamUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5vZygpfSxqZTpmdW5jdGlvbihhKXt0aGlzLmNkKHRoaXMueGUsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVHM6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLm9nKCk6dGhpcy5qZSgiQUFBIil9LG9nOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpO3RoaXMud2QoKX0scmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7Zi5XYSgpJiYoYT0iMSIpO3RoaXMuamMmJihiPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnllKSk7dGhpcy5lZCYmImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSx5bjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuRHAoKSl7dmFyIGE9dGhpcy5qcCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxGYTpmdW5jdGlvbihhLGIsYyxlLGgsSWMpe2E9bmV3IGhiKGEsYixjKTtlJiYoYS5LZz0hMCk7aCYmZi5ncSgpJiYoYS5kZj0hMCk7SWMmJihhLm5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LE9lOmZ1bmN0aW9uKCl7Zi5XYSgpfHxmLlhhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSwKZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtlPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuWmIoKXx8KGE9dGhpcy5LYShlKSxlPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PQpoLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx4bjpmdW5jdGlvbigpe3RoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiOwphLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy55dC5iaW5kKHRoaXMpLHRoaXMueHQuYmluZCh0aGlzKSl9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXtyZXR1cm59Y3x8dGhpcy5MbygpfSx4dDpmdW5jdGlvbigpe30sTG86ZnVuY3Rpb24oKXtmLlRiKGwuS28pO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHdkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMubmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5uYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLm5iW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZmLlhhKGIudXJsLApiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LGZ0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZSxmLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLAplPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGU9MTQ7ZS0tOyljW2JbZV1dPWFbZV18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxmLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGUpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTIwOzM5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT00MDs1OT49ZTtlKyspeD1jKGYsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXg9YyhmLDUpKyhuXnBedykrdCtoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsCmY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuc2l8fGliLG09bmV3IGliO3dpbmRvdy5DdT1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLnlxPXRoaXMuYVsxXTt0aGlzLnJxPXRoaXMuYVs4XTt0aGlzLmtvPXRoaXMuYVs0XTt0aGlzLlV0PXRoaXMuYVs1XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnF0PXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVsxMF07dGhpcy5HbT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs4XX1jLk1wPWI7Yi5wcm90b3R5cGU9e1ZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Xbjp0aGlzLnhxKGEpfSwKeHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlxOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ycTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua286dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlV0OnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5kbDp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXQ6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxwOnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBqYj1jLk1wfHxqYixYYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuVm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5YbT0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5wbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTsKdGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMuanQ9dGhpcy4kYT0hMX1jLmxpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiZ0aGlzLmNvbmZbdGhpcy5MYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLkxhXVthXSk7cmV0dXJuIGJ9LHVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkVhJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLAoiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLmRtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLiRhPWM7aWYodGhpcy5ULlkpdGhpcy5ULnluKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDohMH0pKTp0aGlzLkFhKCk7ZWxzZXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLkpkKGEsYixjKX0sNTApfX0sVmQ6ZnVuY3Rpb24oYSl7dGhpcy5FYz0KITE7dGhpcy5zPWE7dGhpcy51cyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMudXAoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sdXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8ZS5sZW5ndGg7aysrKWVba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLAplW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlP2YuRChsLlJ0LHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk6KGYuS2QoKSxiPT1DLkJlLmNvZGUmJmYuRChsLlVxLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpO2YuRChsLkpvLHRoaXMucy5QLHRoaXMuai51LkIoKSwKdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC56dCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5hdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuZHUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuVnEsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSxmLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGYudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsCiIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sdXM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuVnU9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249CnRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5wbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMubG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLm5tKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5NbigpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnNzKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sc3M6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmZi5vbSh0aGlzLnMub3JpZ2luLnRlKTtmLlphKCJzZXRVcFZwYWlkIik7dmFyIGI9dGhpcy5qLkM7dGhpcy5qLkM9Qi5wb3AoKTtiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuai5DLApiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5qLkcuYXBwZW5kQ2hpbGQodGhpcy5YKTt0aGlzLlgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zLndwKCksYz1hKHRoaXMucy5QLk9yaWdpbmFsQWRQYXJhbWV0ZXJzKSwKZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7Yj1mLnFuKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTXQoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnQoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF0KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB0KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk90KCkpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcykpOwpmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LE50OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LE10OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuWmEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuWmEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuWmEoImZpcnN0UXVhcnRpbGUiKX0sUXQ6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi5aYSgidGhpcmRRdWFydGlsZSIpfSxQdDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5aYSgiY29tcGxldGUiKX0sT3Q6ZnVuY3Rpb24oKXtmLlphKCJhZHN0b3BwZWQiKTt0aGlzLkFhKCl9LGxtOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7dmFyIGU9YixmPXRoaXMuVDsKZi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLkZ0LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxubTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LFhjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IiwKdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG0pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuV2EoKSYmdGhpcy5ULkFnJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5zLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5BYnx8KHRoaXMuQWI9ITAsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLlQuZ2EoInZpZGVvLW5vb3AiKSk7CnJldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLkV0KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9dGhpcy5qLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuS2MucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCmZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5CYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmhlKCkpfS5iaW5kKHRoaXMpOwp0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5abCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LEZ0OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5FZCgpPwp0aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuanQpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm10KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5nZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5rZyk7YyYmKGI9dGhpcy5zLmdlLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwuZW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5wYy5yZXBsYWNlKCJbdGltZV0iLGYuZWYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5wcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5jYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLnduLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0scHA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLlpiKCkmJihmPWguS2EoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7ZS51cmw9ZjthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKd246ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtdDpmdW5jdGlvbihhKXthPT10aGlzLndnfHx0aGlzLkFifHwoMD09YSYmKHRoaXMuJGEmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuJGEpLHRoaXMuJGE9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuV2EoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGYuRChsLmFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi5EKGwuZm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSx0aGlzLlJiJiZmLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLiRsLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC5jbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5EKGwuaG0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSksZi5EKGwuaW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSwKdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnZwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmJxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YuRChsLmJtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSx7YWRJZDp0aGlzLmJkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5JZChlLnVybCxlLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy55YT10aGlzLlhuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5rbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0sdnA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxYbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxFdDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSxFZzpmdW5jdGlvbigpe2YuRChsLkxuLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkVjJiZmLldhKCkmJmYudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZi5lcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMua3QuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5XYi5iaW5kKHRoaXMpKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9lLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtlLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5nZSYmYS5hcHBlbmRDaGlsZChlKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LmhiJiZ0aGlzLmoudS5oYigpJiZ0aGlzLlJxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxsdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEJiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5jYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhkKCl9ZWxzZSB0aGlzLnhkKCl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMDt0aGlzLmouc2YoKTsKdGhpcy5qLlpyKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5XcigpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGYuRWYodGhpcy52aWRlbyxhKT90aGlzLllyKCk6dGhpcy5UZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmxpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVs4XTt0aGlzLmdpPXRoaXMuYVsyXTt0aGlzLkJvPXRoaXMuYVsxMF07dGhpcy5KbD10aGlzLmFbN107dGhpcy5Iaj10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLlFtPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/CnRoaXMuRG86dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk9yOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5naTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQm86dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iajp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy5RbXx8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuYWE9bnVsbDt0aGlzLk1iPSExO3RoaXMudGU9IiI7dGhpcy5zZT0hMTtkJiZkLmVtcHR5P3RoaXMuSXEoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5zbD1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5XZSgpLGI7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS5UYShtLktzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSHEuYmluZCh0aGlzKSx0aGlzLkRxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkVhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5FYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuRWEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwKMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxIcTpmdW5jdGlvbihhKXt0aGlzLlByKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSXE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQmEoeC5rZCkpfXRoaXMuYmE9dGhpcy5mZigpO3RoaXMuTWI9dGhpcy5yZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuUmMoKTp0aGlzLmZhKHRoaXMuQmEoeC5nYyx7ZXJyb3I6dGhpcy5zZT9DLmpkOkMuQWV9KSl9LERxOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkJhKHguemUse2RlcHRoOmF9KSl9LFJjOmZ1bmN0aW9uKCl7dGhpcy5hYT10aGlzLmJhLnNoaWZ0KCk7dGhpcy5pcSgpP3RoaXMuYXQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy52dCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSx2dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLllzKCk/dGhpcy5YcygpPyEwOigtMSE9dGhpcy5VYigpPwp0aGlzLmZhKHRoaXMuQmEoeC52ZSkpOnRoaXMuZmEodGhpcy5CYSh4Lm5oKSksITEpOih0aGlzLmZhKHRoaXMuQmEoeC5nYyxDLkJlKSksITEpfSxWZDpmdW5jdGlvbihhKXthLnlhPWEueWEuY29uY2F0KHRoaXMuTWQoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy5NYjt0aGlzLnBhcmVudC5WZChhKX0sU246ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbGI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMubGYoKTthLnZjPXRoaXMuZnAoKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLmJwKCk7YS5nZT10aGlzLnRwKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLmhwKCkpOmIueWEuY29uY2F0KHRoaXMubnAoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksCmE9MCx0aGlzLlJjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYSYmdGhpcy5wYXJlbnQuZmEoYiksYT0wKX0seGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQueGIoYSl9LCRlOmZ1bmN0aW9uKGEsYil7dGhpcy5mYSh0aGlzLkJhKGEsYikpfSxCYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBtYihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGF0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sWXM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxYczpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sUHI6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuc2U9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnFmKCkubGVuZ3RofSxxZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFwKHRoaXMuYWEsIlZBU1RBZFRhZ1VSSSIpfSxNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sCm5wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LGhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxmcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnliKHRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApBdTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy55YihhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LGJwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0KIiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMucmYoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2YucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sdHA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5GcyhnLGEpLDA+CmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxxcDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMueWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHhwOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx5YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJmKGEpOiIifSxyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnhwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5zbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gbj10aGlzLmFbMV07CnRoaXMuZnM9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzhdO3RoaXMuUWo9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy53aD1iO2IucHJvdG90eXBlPXtFbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRm46dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZzOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qbzp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBuYj1jLndofHxuYixaYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT0KW107dGhpcy52Yz0iIjt0aGlzLlA9dGhpcy52Yj0hMTt0aGlzLm9yaWdpbj1udWxsfWMubms9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sd3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBsYj1jLm5rfHxsYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scj10aGlzLmFbNl07dGhpcy5ZaD10aGlzLmFbMTBdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOV19Yy5IaD1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlloOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56cjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIG9iPWMuSGh8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5rcig0KTt2YXIgeD17a2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LG5oOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxnYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxDZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHplOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0saGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnB1Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSx2ZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17QWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sQmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0scnU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubnI9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbM119Yy5hcj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5yOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMuYXJ8fHBiLGFkPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLm1yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5LaD1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMuS2h8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naz10aGlzLmFbOF07dGhpcy5MbD10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbMTBdO3RoaXMuZW49dGhpcy5hWzldO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbMl19Yy5Maz1iO2IucHJvdG90eXBlPXtmazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2s6dGhpcy5LbChhKX0sS2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkpwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5Ma3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PWJkLmZrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMudGg9YjtiLnByb3RvdHlwZT17Z2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLiRwKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PQp3aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2UmJihoLnBvc2l0aW9uPWUpO3JldHVybiBofSxMczpmdW5jdGlvbigpe3RoaXMuSWY9ITB9LHlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sVmY6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtmLkQobC55Yyx0aGlzLnUuQigpKX0sWnI6ZnVuY3Rpb24oKXt0aGlzLklmfHwodGhpcy51LnBsYXkoKSxmLkQobC56Yyx0aGlzLnUuQigpKSl9LGNjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKwoicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlFhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUWEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUWEpO3RoaXMudS5EYiYmdGhpcy51LkRiKCk/dGhpcy51LmdmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy51Zi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sJHA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGdwOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LHVmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5RYSk7aWYoYi54IT10aGlzLlJhLnh8fGIueSE9dGhpcy5SYS55fHxiLnBvc2l0aW9uIT10aGlzLlJhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlJhLndpZHRofHxiLmhlaWdodCE9dGhpcy5SYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5SYS53aWR0aCYmMDx0aGlzLlJhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuc2YoKTtyZXR1cm59dGhpcy5SYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLnZmLmxlbmd0aDthKyspdGhpcy52ZlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxzZjpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkcpO3RoaXMuQyYmdGhpcy5DLnBhdXNlJiZ0aGlzLkMucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBOPWMudGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0KImJsb2NrIjtMLmlkPWYucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLFk9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vbz10aGlzLmFbOF07dGhpcy4kZz10aGlzLmFbMTBdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuQW09dGhpcy5hWzEwXTt0aGlzLkVtPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzhdfWMuZXQ9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9vOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kZzp0aGlzLnZzKGEpfSwKdnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLndzOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQW06dGhpcy5EbShhKX0sRG06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgc2I9Yy5ldHx8c2IsY2Q9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2Qubm8oNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpOwp0aGlzLk8oYSk7dGhpcy5mZShiKTt0aGlzLlhlKCl9LGZlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQ2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlIoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQ2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB0Yj1jLlVqfHx0YjsoZnVuY3Rpb24oYyl7Yy5Uaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9WigpO3RoaXMudWI9dGhpcy51Ynx8ITE7dGhpcy5HZT10aGlzLkplPXRoaXMuemY9dGhpcy5pYT10aGlzLm1lPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLApiKXt0aGlzLlhvKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5tZT0hMDt0aGlzLnpmJiZ0aGlzLlJlKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZmI7YSYmYS5ZYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy56Zj0hMDt0aGlzLlJlKCl9LmJpbmQodGhpcykpO3RoaXMuTmUoKX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy51Yil7dGhpcy50YygpO2lmKCF0aGlzLm1lJiYhdGhpcy50YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwKMTAwKSwhMDt0aGlzLm1lJiZ0aGlzLkdlJiYhdGhpcy5KZSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19LHRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxtZjpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxOZTpmdW5jdGlvbigpe2lmKHRoaXMudGMoKSl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkplPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuR2U9Yi53dX10aGlzLmhhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmUoKX0uYmluZCh0aGlzKSwxMDApfSxEdTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5RdSgpOiExfSxVYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuVWIoKTotMX0sb3A6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sWG86ZnVuY3Rpb24oYixhKXt0aGlzLnViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMudWJ8fDMwMj09dGhpcy51Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy51Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX0seGM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPyh0aGlzLm0oKSx0aGlzLm5hKCkpOmIuTmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciB1Yj1jLlRqfHx1YjsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGhxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLnJrLldsLlVsP3dpbmRvdy5PTy5yay5XbC5VbC51dShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ocSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPVooKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxmLkRhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB0YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgdWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIHZiPWMuVmp8fHZiLHdiPW5ldyB2YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcT10aGlzLmFbOF07dGhpcy5Ibj10aGlzLmFbNV07dGhpcy5DbT10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs3XX1jLlZpPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLkduKGEpfSwKR246ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5DbTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3U6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy5WaXx8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuTHEoNCk7KGZ1bmN0aW9uKGMpe2MuVWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5Va3x8eWI7KGZ1bmN0aW9uKGMpe2MuVGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp5LnFkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuYnIoYSl9LmJpbmQodGhpcykpO3kuQ3AoKX0sYnI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7CnRoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgemI9Yy5Ua3x8emI7KGZ1bmN0aW9uKGMpe2MuVms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuJG4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9CltdKTt0aGlzLlNjLnB1c2goYlthXSk7dmFyIGU9bmV3IHliKGQpO3RoaXMuSShlKXx8KHRoaXMuTChlKSwobmV3IHpiKGUsdGhpcy5BKSkuYigpKX1jYXRjaChoKXt9fX10aGlzLkgoKX0scWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuWnx8KHRoaXMuWj17fSk7dGhpcy5aW2JdfHwodGhpcy5aW2JdPXt9KTt0aGlzLlpbYl1bYV18fCh0aGlzLlpbYl1bYV09W10pO3RoaXMuWltiXVthXS5wdXNoKGMpfSxidDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMuWHIoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSwKQ3A6ZnVuY3Rpb24oKXtpZih0aGlzLiRiKWZvcih2YXIgYj0wO2I8dGhpcy4kYi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLiRiW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5aW2NdW2RdJiYwPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ0KGIpfX0pfSkoYyk7dmFyIEFiPWMuVmt8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaj0KdGhpcy5hWzNdO3RoaXMub3U9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5taD1iO2IucHJvdG90eXBlPXtFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm91OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgQmI9Yy5taHx8QmIsZWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRWooNCk7KGZ1bmN0aW9uKGMpe2MuZ2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0samI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLmdofHxDYjsoZnVuY3Rpb24oYyl7Yy5oaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkNyfHwodGhpcy5Dcj0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5oaHx8RGI7KGZ1bmN0aW9uKGMpe2MuaWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgQ2IoZCk7dGhpcy5JKGYpfHwodGhpcy5MKGYpLChuZXcgRGIoZix0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5IKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5paHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maj10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbMTBdO3RoaXMuYmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbM119Yy5Fbz1iO2IucHJvdG90eXBlPXtLajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTGo6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlpuOnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaDp0aGlzLmFqKGEpfSxhajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYj1jLkVvfHxHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC5Laig0KTsKKGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLnlsfHxIYjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy5ab3x8KHRoaXMuQWYoKSx0aGlzLlpvPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLkxlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5MZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLAo1MDApKX0sY3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jcCgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5vKCksdGhpcy5sKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZigpfS5iaW5kKHRoaXMpLDUwKX0sT3U6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBJYj1jLnhsfHxJYjsoZnVuY3Rpb24oYyl7Yy56bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5MKGMpLChuZXcgSWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEpiPWMuemx8fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy5RcD10aGlzLmFbN107dGhpcy5SbD10aGlzLmFbN107dGhpcy5VcD10aGlzLmFbMTBdOwp0aGlzLiRrPXRoaXMuYVs1XTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuVmc9YjtiLnByb3RvdHlwZT17Um06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNtOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcDp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmw6dGhpcy5UcChhKX0sVHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlVwOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kazp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLlZnfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9Z2QuUm0oNCk7KGZ1bmN0aW9uKGMpe2MuaGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYoMCx0aGlzLkopKCEwKX0uYmluZCh0aGlzKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTsKdmFyIE1iPWMuaGp8fE1iOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZ20oKX0uYmluZCh0aGlzKSksdGhpcy5KZz0hMSx0aGlzLlN0PQoxRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLlN0KSl9LGdtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTsKYltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy5nanx8TmI7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8CndpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpO3ZhciBPYj1jLmlqfHxPYixQYj1uZXcgT2IocSk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs5XTt0aGlzLmxxPXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVsxMF07dGhpcy5KaD10aGlzLmFbN107dGhpcy5PcD10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52aDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy54aChhKX0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnloOnRoaXMuSWgoYSl9LEloOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLlNxfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTmt8fFJiOyhmdW5jdGlvbihjKXtjLk1rPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLkdkKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLAoxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLk1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5Paz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmCiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIFRiPWMuT2t8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbMTBdO3RoaXMuSmk9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy4kcj1iO2IucHJvdG90eXBlPXtFaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmk6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkppOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5QbTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOgphfX19KShjKTt2YXIgVmI9Yy4kcnx8VmIsaWQ9bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aWQuRWkoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuV2Q9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkZyKCl9LmJpbmQodGhpcyksNTAwKX0sRnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJgpiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2QmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuV2QpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwKInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sSHM6ZnVuY3Rpb24oKXt0aGlzLldkPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgV2I9Yy5Fa3x8V2I7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLktiPTB9LGI6ZnVuY3Rpb24oKXt0aGlzLk5xPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMuS2J8fHRoaXMuS2IrKyx0aGlzLktiPD10aGlzLk5xPyh0aGlzLktiKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IcygpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgWGI9Yy5Ea3x8WGI7KGZ1bmN0aW9uKGMpe2MuRms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IFdiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFhiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgWWI9Yy5Ga3x8WWIsWmI9bmV3IFliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLkRpPXRoaXMuYVs5XTt0aGlzLlFzPXRoaXMuYVsxMF07dGhpcy4kaj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkJoPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nbjp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVGg6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOgp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgJGI9Yy5CaHx8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuZm4oNCk7KGZ1bmN0aW9uKGMpe2Muems9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5PKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlIoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLkooKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy56a3x8YWM7KGZ1bmN0aW9uKGMpe2MueWs9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkNhKCk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkljKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5CcSgpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxObjpmdW5jdGlvbigpe3RoaXMuRmUoKXx8dGhpcy5vKCEwKX0sQnE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5JYygpOyFiLm1hJiZiLmJhJiZiLnR1JiZiLnZ1JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkNhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10uaWQ9PQphKXJldHVybiBiW2NdO3JldHVybnt9fSxHZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxvOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5JYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLnlrfHxiYzsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSlmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IGJjKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBjYz1jLkFrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzFdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMud3E9dGhpcy5hWzldO3RoaXMubGg9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ibz1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR2g6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNrOnRoaXMuQ2goYSl9LENoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EaDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3E6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMuYm98fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWtkLkZoKDQpOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuTyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5SKGEpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sSzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQ2E6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmCih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVD1jLnJqfHxUOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlhkPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGQ9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5YZCYmYiE9dGhpcy5YZHx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKGsuYWRUYWc9YS5hZFVSTCksdGhpcy5sKCJhZGVycm9yIixhLlN1KSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVPWMucWp8fFU7KGZ1bmN0aW9uKGMpe2Muc2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEQpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgVChiKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgVShiLHRoaXMuQSksYi5iKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFQoYiksYi5qYT90aGlzLmNnKCk6dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBELGZjPWMuc2p8fGZjLGdjPW5ldyBmYyhmdW5jdGlvbihjLGIpe2MucGF1c2UoKTtpZihtLm5iLmxlbmd0aCl7dmFyIGE9bS5uYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9Zi5wcyh7IltMT0FEU0NSSVBUXSI6Zi5wYSgxMCksIltVVElMU10iOmYucGEoMTApLCJbQ0FMTEJBQ0tdIjpmLnBhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09Zi5NZi5iaW5kKGYpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKWtbZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWYuTWYoZywKZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obz10aGlzLmFbNV07dGhpcy5Fcz10aGlzLmFbOV07dGhpcy5tbz10aGlzLmFbMV07dGhpcy56aj10aGlzLmFbM107dGhpcy5pbz10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbOF07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbM107dGhpcy5maj10aGlzLmFbMl07dGhpcy5nPXRoaXMuYVsyXX1jLnRpPWI7Yi5wcm90b3R5cGU9e01vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Obzp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRXM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5tbzp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Jazp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBsOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhjPWMudGl8fGhjLGxkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLk1vKDQpOyhmdW5jdGlvbihjKXtjLmdsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuTyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlIoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlRxPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxnczpmdW5jdGlvbihiKXt0aGlzLm5kPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UcX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sSzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJih0aGlzLkomJnRoaXMuSigpLHRoaXMubmQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm5kJiYobmV3IEcodGhpcyx0aGlzLm5kKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuZ2x8fE07KGZ1bmN0aW9uKGMpe2MuZmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5BZClpZih0aGlzLmdifHwodGhpcy5nYj0wKSx0aGlzLmdiKyssMTU8dGhpcy5nYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHRoaXMucnMoKSwhMDt0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm8oKTp0aGlzLm8oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEc9Yy5mbHx8RzsoZnVuY3Rpb24oYyl7Yy5obD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy53YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYi5ncyh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgaWM9Yy5obHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm11PXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMudG89YjtiLnByb3RvdHlwZT17bHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm11OnRoaXMubW4oYSl9LG1uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMudG98fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5sdSg0KTsoZnVuY3Rpb24oYyl7Yy5vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5VZT0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5SKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSwKe2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3JuOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuVWU9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3JuOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5vanx8bGM7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sV3U6ZnVuY3Rpb24oKXt9LFJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWUobmV3IGZ1bmN0aW9uKCl7fSk7YS5xdT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5ScihhKTsKd2luZG93Lnl1PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLlFyfHwodGhpcy5Rcj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRkfHwodGhpcy5EZD0xKTtpZigyMDx0aGlzLkRkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5EZCsrOwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmCmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuVyghMCl9LmJpbmQodGhpcykpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMubmp8fG1jOyhmdW5jdGlvbihjKXtjLnBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgbmM9Yy5wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmpuPXRoaXMuYVs0XTt0aGlzLnRtPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzhdfWMuRWg9YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbjp0aGlzLnNtKGEpfSwKc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgcGM9Yy5FaHx8cGMsbmQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bmQuTW0oNCk7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKTthJiZ0aGlzLk8oYS5wYXJlbnROb2RlKX0sSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFY9Yy5sanx8VjsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy53Zj0wO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT10aGlzLlhiPXRoaXMuVmE9dGhpcy5xYz0hMTt0aGlzLmFnPWYua2IoMTApO3RoaXMuRmYoKX0sRmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm8oITApOnRoaXMubygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmYuYmluZCh0aGlzKSwxMDApLCExfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSwKdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBXPWMua2p8fFc7KGZ1bmN0aW9uKGMpe2MubWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFYod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7CmVsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBWKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIHFjPWMubWp8fHFjLHJjPW5ldyBxYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VZz10aGlzLmFbNF07dGhpcy5waD10aGlzLmFbNV07dGhpcy5sbD10aGlzLmFbMl07dGhpcy5Eaj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs1XX1jLmtpPWI7Yi5wcm90b3R5cGU9e1RnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VZzp0aGlzLm9oKGEpfSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucGg6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sbDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGo6dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVpOnRoaXMuUW8oYSl9LFFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Sbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMua2l8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLlRnKDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLk8oYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5RaHx8dGM7KGZ1bmN0aW9uKGMpe2MuUGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsCmZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5vKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5QaHx8dWM7KGZ1bmN0aW9uKGMpe2MuUmg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGYuRGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkkoZCl8fCh0aGlzLkwoZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkgoKX19KX0pKGMpO3ZhciB2Yz1jLlJofHx2Yyx3Yz1uZXcgdmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJsPXRoaXMuYVsxMF07dGhpcy54az10aGlzLmFbM107dGhpcy5XbT10aGlzLmFbM107dGhpcy5jbj10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbM107dGhpcy50bj10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLnZyPWI7Yi5wcm90b3R5cGU9e0FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CbDp0aGlzLndrKGEpfSx3azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGs6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldtOnRoaXMuYm4oYSl9LGJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jbjp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua2s6dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRuOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgeGM9Yy52cnx8eGMscGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuJGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLk8oYiksdGhpcy5SKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHljPWMuJGh8fHljOyhmdW5jdGlvbihjKXtjLlpoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlBlKCl9LFBlOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5aaHx8emM7KGZ1bmN0aW9uKGMpe2MuYWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5qYSl7dGhpcy5IKCk7cmV0dXJufWlmKCF0aGlzLkkoYikpe3RoaXMuTChiKTsobmV3IHpjKGIsdGhpcy5BKSkuYigpO3RoaXMuSCgpO3JldHVybn19dGhpcy5IKCl9fSl9KShjKTt2YXIgQWM9Yy5haXx8QWMsQmM9bmV3IEFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsyXTt0aGlzLkNzPXRoaXMuYVsxXTt0aGlzLnRrPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVsxMF07dGhpcy5laz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs5XX1jLmpxPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IaTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRrOnRoaXMuY3IoYSl9LGNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuZHI6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5qcXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGY9dGhpcy5LZj10aGlzLkpmPSExO3RoaXMuVWM9W107dGhpcy4kZD17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcmM/bnVsbDpyYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBGYj9udWxsOkZiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFViP251bGw6VWIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHdiPwpudWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB4YT9udWxsOnhhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE1hP251bGw6TWEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgbmE/bnVsbDpuYX19Yy5waz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnJwKGEpOltdLGI7dGhpcy5LZj0hMDtpZihhLmxlbmd0aCl7dGhpcy5KZj0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPQphW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxycDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZFtjXSx0aGlzLm9lKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEpe3RoaXMub2UoYSkmJmEuYigpfSxKczpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuSmYpZm9yKHRoaXMuSGY9ITAsYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXRoaXMuVWNbYV0ucWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5VY1thXS5xYil9fX0pKGMpO3ZhciBEYz1jLnBrfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Q9dGhpcy5hWzRdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMV19Yy53bD1iO2IucHJvdG90eXBlPXtWdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3Q6dGhpcy5pdShhKX0saXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmp1OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qbDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEVjPWMud2x8fEVjLHJkPW5ldyBFYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLlZ0KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZi5UYihsLnd0KSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5UYihsLldxKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxiYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRj1uZXcgZ2Esaz0hMTtGLk1jKCk7Ri5CZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuTWMoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkJmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5NYygpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2YuZmlyZUV2ZW50KHdpbmRvdyxGLlhwKCkse2lkOnRkfSl9LDUwMCk7YWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bz10aGlzLmFbMV07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMueXM9dGhpcy5hWzEwXTt0aGlzLkpqPXRoaXMuYVsyXTsKdGhpcy5vdD10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzEwXTt0aGlzLklvPXRoaXMuYVsxXTt0aGlzLm5sPXRoaXMuYVs0XTt0aGlzLmFwPXRoaXMuYVs0XTt0aGlzLmRqPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzZdfWMuTWo9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZvOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5mdTp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Kajp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3Q6dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJqOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6CnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hcDp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLk1qfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC51byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmY9dGhpcy5jb25mPXRoaXMuVWE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLlBjPTA7dGhpcy5MYT0iIjt0aGlzLlZjPVtdO3RoaXMuV2M9MDt0aGlzLiRmPSExO3RoaXMuWWQ9W119Yy5MZz1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXt0aGlzLlpmPWF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGpzOmZ1bmN0aW9uKGEpe3RoaXMuVWE9YX0saHM6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5MYV0mJnRoaXMuY29uZlt0aGlzLkxhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTGFdW2FdKTtyZXR1cm4gYn0sYmM6ZnVuY3Rpb24oYSxiKXtmLmliKCJ3ZWx0LmRlIikmJmYuWGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpOwp2YXIgYz0hMSxlPSExO2lmKHRoaXMuWXAoKSl0aGlzLlVhLmModGhpcy5VYS5KYyx0aGlzLlVhLnphLHRoaXMuVWEuWmQsZnVuY3Rpb24oKXt0aGlzLmJjKGEsYil9LmJpbmQodGhpcyksdGhpcy5VYS5CYyk7ZWxzZSBpZih0aGlzLkVwKCkpdGhpcy5jcyhmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YuRChsLnljLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkxzKCk7ay5leGl0RnVsbHNjcmVlbigpO1E9az1uZXcgTyhrLHRoaXMuVWEsaCk7ay5nZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5LcShhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpOwpoLmFkU3RhcnRUaW1lb3V0JiYoZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5KZChhLGMsZSk7dGhpcy5wbGF5ZXIuaGcoayl9fSxZcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlBjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuUGMuZ2V0VGltZSgpLHRoaXMuUGM9YSwzRTU8Yj8hMDohMTt0aGlzLlBjPWE7cmV0dXJuITF9LEFzOmZ1bmN0aW9uKCl7Zi5lZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmFmKGEpKT90aGlzLmJjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfSx6czpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLm9zKCEwKTsKdmFyIGI9dGhpcy5jb25mLGM9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5hZihjKSk/dGhpcy5iYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9fSxhZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sVHI6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50cyh0aGlzLnpzLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmVhKCl9LCRjOmZ1bmN0aW9uKGEpe2YuZWUoIm1pZHJvbGwiKTtpZighdGhpcy5PZil7dGhpcy5PZj0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuYmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2Y9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LFNyOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIubnModGhpcy4kYy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5BcygpO3RoaXMucGxheWVyLk5kJiZ0aGlzLlNyKCk7dGhpcy5UcigpfSxVcjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLlZjLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5rdShhLGIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlciwKYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLldjPXRoaXMuVmMubGVuZ3RofSxFcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5XYyYmKGE9ITApO3JldHVybiBhfSxjczpmdW5jdGlvbihhKXt0aGlzLiRmPWE7Zm9yKGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl0aGlzLlZjW2FdWyJmdW5jdGlvbiJdKHRoaXMuSXIuYmluZCh0aGlzKSl9LElyOmZ1bmN0aW9uKGEpe3RoaXMuV2MtLTthJiZ0aGlzLllkLnB1c2goYSk7MD49dGhpcy5XYyYmdGhpcy4kZigpfSxLcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5ZZC5sZW5ndGg7YysrKWI9dGhpcy5ZZFtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZGE9Yy5MZ3x8ZGEsUT0hMSxqYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaD10aGlzLmFbN107CnRoaXMuWGc9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMucG49YjtiLnByb3RvdHlwZT17emg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFoOnRoaXMuV2coYSl9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdjPWMucG58fEdjLHZkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnpoKDQpfSkuY2FsbChWb3B1V3VpdlhhaExpb1llLFZvcHVXdWl2WGFoTGlvWWUpOwo=
Protocol
HTTP/1.1
Server
2a02:26f0:6c00:197::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
Apache /
Resource Hash
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a

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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Wed, 11 Jul 2018 20:06:01 GMT
Content-Encoding
gzip
Last-Modified
Mon, 02 Jul 2018 09:46:37 GMT
Server
Apache
ETag
"bdd1fe062d58c3e9d9216922f317755d:1530524797"
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
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/
1 MB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/a.mp4
Protocol
HTTP/1.1
Server
2a02:26f0:eb:193::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx/1.8.0 /
Resource Hash

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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=1179648-

Response headers

Date
Wed, 11 Jul 2018 20:06:01 GMT
Access-Control-Allow-Methods
GET, HEAD, OPTIONS
X-Vod-Session
475377868
Content-Range
bytes 1179648-75873255/75873256
Connection
keep-alive
Content-Length
74693608
Last-Modified
Sun, 19 Nov 2000 08:52:00 GMT
Server
nginx/1.8.0
ETag
"3a1794b0-485bbe8"
X-Vod-Me
ny-front-vod1
Content-Type
video/mp4
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Server,Content-Length,Content-Range,Date
Cache-Control
max-age=3350636
Accept-Ranges
bytes
Access-Control-Allow-Headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
Expires
Sun, 19 Aug 2018 14:49:57 GMT
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
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=6559380469
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvcHVXdWl2WGFoTGlvWWU9Vm9wdVd1aXZYYWhMaW9ZZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWGEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLmpzKG0pLGEuaHMoayksYS5VcigpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2o9dGhpcy5hWzFdO3RoaXMuUmc9dGhpcy5hWzZdO3RoaXMuUGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNF19Yy5OZz0KYjtiLnByb3RvdHlwZT17Tmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9qOnRoaXMuUWcoYSl9LFFnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SZzp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYT1jLk5nfHxlYSxIYz1uZXcgZWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1IYy5Oaig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5FYT0ic2V0dXAiO3RoaXMuZGM9W107dGhpcy5TZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkhyLmJpbmQodGhpcykpfWMubmk9YjtiLnByb3RvdHlwZT17U2U6ZnVuY3Rpb24oKXt0aGlzLmxhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LG9tOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YS5wb3N0TWVzc2FnZShiLCIqIil9LEdhOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxIcjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5HcihhLmRhdGEpfSxHcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMubGEuZXZlbnRsaXN0ZW5lci5sZW5ndGg7YisrKWEuZXZlbnQ9PQp0aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSxyZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxtbTpmdW5jdGlvbihhLGIpezA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sYmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7Zm9yKHZhciBkPTA7ZDx0aGlzLmxhLmVycm1zZy5sZW5ndGg7ZCsrKWIrPSJcbiIrdGhpcy5sYS5lcnJtc2dbZF07dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxEYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT0KdHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxoZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSXM6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sRGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9MCxjPTAsaD0wLGY9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7ZT11LmhlaWdodDswPnUudG9wJiYoZSs9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZS09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYKKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5lJiYoZT0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCplKTtoPj1iJiYoZj0hMCk7cmV0dXJuIGZ9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSwKQmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGU7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZT1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitlLGJ8PTA7cmV0dXJuIGJ9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGcrPWUudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxjLGg9QXJyYXkoODApLGY9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZT0wO2U8bi0zO2UrPTQpYz1hLmNoYXJDb2RlQXQoZSk8PDI0fGEuY2hhckNvZGVBdChlKzEpPDwxNnxhLmNoYXJDb2RlQXQoZSsyKTw8OHxhLmNoYXJDb2RlQXQoZSszKSwKcC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGUpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKyloW2VdPXBbYStlXTtmb3IoZT0xNjs3OT49ZTtlKyspaFtlXT1kKGhbZS0zXV5oW2UtOF1eaFtlLTE0XV5oW2UtMTZdLDEpO2M9ZjtuPXU7bD1rO3c9STtxPW07Zm9yKGU9MDsxOT49ZTtlKyspcj1kKGMsNSkrKG4mbHx+biZ3KStxK2hbZV0rMTUxODUwMDI0OSYKNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTIwOzM5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT00MDs1OT49ZTtlKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXI9ZChjLDUpKyhuXmxedykrcStoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2Y9ZitjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihmKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx3YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxlLGMsaCxmLHUsaz0wO2s8YS5sZW5ndGg7KWQ9CmEuY2hhckNvZGVBdChrKyspLGU9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LGY9KGUmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGUpP2Y9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sZ3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZT0hMSxjPSExLGg9ITEsZj0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtlPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRtPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGY9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1lO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1mO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxlcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuV2UoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxXYTpmdW5jdGlvbigpe3ZhciBhPXtZZzpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKamg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sWWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFltOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWcoKXx8YS5qaCgpfHxhLkdwKCl8fGEuWWooKXx8YS5DbCgpfX07cmV0dXJuIGEuWW0oKX0sS2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbYltlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGU9MCxjPWEubGVuZ3RoO2U8YzsrK2UpYi5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxiW2FbZV1dPTEpO3JldHVybiBkfSxvZjpmdW5jdGlvbihhKXthPXRoaXMuS2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSwkbjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxlPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8ZS5wdXNoKGFbY10pO3JldHVybiBlfSxGczpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGU9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZT1hLnNwbGl0KCIlIiksZD1iLzEwMCplKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGVmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54ZyhiKSsiOiIrdGhpcy54ZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZTpmdW5jdGlvbihhKXt0aGlzLkVhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU7ZC5zdGF0ZT10aGlzLkVhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2U9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGUpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxlLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5GYyhiLGQpKTtiJiYoaD1sLkZjKGEsYikpO2UmJihoPWwuRmMoaCxlKSk7YyYmKGg9bC5GYyhoLGMpKTtmLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBlPW0uYWUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uVGEoZSwhMCk7ZT1tLlRhKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRmEoZSxmdW5jdGlvbihkKXt2YXIgZT0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZT0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZT0hMSl9Y2F0Y2goYyl7fWV8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLAooZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oKXttJiZtLlk/bS5pc0VuYWJsZWQmJm0ueG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2QoKX0uYmluZCh0aGlzKSw1MDApfSxxbjpmdW5jdGlvbihhLGIpe2lmKGIuT2MoYSl8fCJhYm91dDpibGFuayI9PWF8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLmJmKGEpKXJldHVybiB0aGlzLmJmKGEpO3ZhciBkPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2QuaG9tYWRfdXJsX3N1ZmZpeD0KYTtkLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoYSk7ZC5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2QuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt2YXIgZT0hMSxjPSExLGM9dGhpcy5YYShhLGIudWEsZCxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWMpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMubW0oZSxhKTtyZXR1cm4gZX0sWGE6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZix1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suVGEoYSxoKTtoPWsuVGEoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5GYShoLGUsYywiIiwiIixmKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoYSxiLGQsZSxjLGssZix1KX0uYmluZCh0aGlzKSw1MDApfSxGcTpmdW5jdGlvbihhLGIsZCxlLGMsaCxmKXt2YXIgdT0hMDtmJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtmPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZilkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGZba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZShsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sR3E6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRnEoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZGMpZm9yKHZhciBjIGluIHRoaXMuZGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5kY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2Yud2IoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTWY6ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5YYShhLGUudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkdxKGUuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZSwhMCl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRjPWF9LGt1OmZ1bmN0aW9uKGEsYixkLGUsYyl7dGhpcy5YYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmV9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX0pfSxabTpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LGJxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLm5pfHxQO25ldyBQO3ZhciBmPW5ldyBQO3dpbmRvdy5CdT1mOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1pPWI7Yi5GYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGU7Zm9yKGUgaW4gYilkW2VdPWJbZV07Zm9yKGUgaW4gYSlkW2VdPWFbZV07cmV0dXJuIGR9O2IudXI9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnE9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ0PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuSm89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZtPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLiRsPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5jbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5obT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWmw9e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLmFtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuenQ9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVxPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLktvPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdT17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Mbj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlFuPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuemM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuZW09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5JZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuSGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuaW09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5ibT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iud3Q9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5XcT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMubWl8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHI9dGhpcy5hWzVdO3RoaXMuQXE9dGhpcy5hWzRdO3RoaXMuS249dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19CmMudXE9YjtiLnByb3RvdHlwZT17b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnByOnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5BcTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgZmE9Yy51cXx8ZmEsSmM9bmV3IGZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMub3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5vaT1iO2IucHJvdG90eXBlPXtCZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZSxjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBNYXRoLmFicyhiKX0sCmViOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxtcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxHYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTsKaWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxNYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5HYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYygpKyIyIn0sQmY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLm1wKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09CmIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5vaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueHI9dGhpcy5hWzhdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMuS2s9dGhpcy5hWzRdO3RoaXMudm09dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzVdO3RoaXMuZHQ9dGhpcy5hWzddO3RoaXMubnE9dGhpcy5hWzVdO3RoaXMuQmk9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbN119Yy5VaD1iO2IucHJvdG90eXBlPXt3cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueHI6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ0OnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lazp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudm06dGhpcy5hcyhhKX0sYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5iczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZHQ6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5xOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhhPWMuVWh8fGhhLEtjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLndyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGU9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZVtjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGdbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5pO3RoaXMuaT1kW2FdO3ZhciBlPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaT1nO3JldHVybiBlfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBlLmM/ZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2UuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1lO2UuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51ZT1ifSkoYyk7dmFyIEo9Yy51ZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbOF07dGhpcy54aT10aGlzLmFbOF07dGhpcy5ycj10aGlzLmFbNl07dGhpcy5odD0KdGhpcy5hWzNdO3RoaXMuVG89dGhpcy5hWzEwXTt0aGlzLllxPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuR3M9YjtiLnByb3RvdHlwZT17TWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5pOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGk6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJyOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odDp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVG86dGhpcy5YcShhKX0sWHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLkdzfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuTWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5vaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5rcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGtzOmZ1bmN0aW9uKGIpe3RoaXMuQT0KYn0sbHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxMOmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5lYigpXT1iO0smJksuS2YmJksuSnMoYil9LEp1OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmViKCldPyEwOiExfSxmcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFh1OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMub2t8fHI7KGZ1bmN0aW9uKGMpe2MucWs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9Cm51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuZmI9IiI7dGhpcy5ZZT0hMTt0aGlzLk4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSx0czpmdW5jdGlvbihiKXt0aGlzLko9Yn0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxuczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LEl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LAppc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxZdTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcCgpfHx0aGlzLmptKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEx1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGptOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPwohMDohMX0sTzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxDYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxoYjpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmZiPQpifSxIdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZifSxXcjpmdW5jdGlvbigpe3RoaXMuZmI9bnVsbH0sTnU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmZiJiYoYj0hMCk7cmV0dXJuIGJ9LFR1OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxFdTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5xa3x8cDsoZnVuY3Rpb24oYyl7Yy5NZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLlZsPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuS2U9dGhpcy5CZz0hMTt0aGlzLnN0YXR1cz10aGlzLmljO3RoaXMuaWQ9Zi5wYSgxMCk7dGhpcy5ZYyhiKTt0aGlzLmxzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLnFzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy50YiYmMDx0aGlzLnRiLmxlbmd0aCYmKHRoaXMudGI9Zi51bmlxdWUodGhpcy50YiksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sTXU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LHFzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuRWV9LHJzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5WbH0sQ2I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGxzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxscDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEpxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5NZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hbz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLlNnPWI7Yi5wcm90b3R5cGU9CntGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlNnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Gbyg0KTsoZnVuY3Rpb24oYyl7Yy5yaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LApwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLnJofHxSOyhmdW5jdGlvbihjKXtjLnFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuR3Q9MUUzO3RoaXMuV2Y9bnVsbDt0aGlzLml0PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy4kbSliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLllvLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5CcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLkFwKGEsCmIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuSnQoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLkt0KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuenAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sT246ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxKdDpmdW5jdGlvbihiKXt0aGlzLmdkfHwodGhpcy5nZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTHQoYil9LmJpbmQodGhpcyksdGhpcy5HdCkpfSxMdDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCk7dGhpcy53KCl9LEt0OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdkKX0sCnpwOmZ1bmN0aW9uKGIpe3RoaXMuenUoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuRHI8dGhpcy5pdD90aGlzLncoKTp0aGlzLm0oKX0sQnA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxZbzpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXt0aGlzLkRyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMucWh8fGxhOyhmdW5jdGlvbihjKXtjLnNoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGYuRGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgUihiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBsYShnLAp0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5zaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs3XTt0aGlzLkptPXRoaXMuYVs0XTt0aGlzLnJtPXRoaXMuYVs4XTt0aGlzLlVtPXRoaXMuYVs4XTt0aGlzLlNzPXRoaXMuYVsxXTt0aGlzLkRuPXRoaXMuYVs0XTt0aGlzLll0PXRoaXMuYVs1XTt0aGlzLnJsPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuSW49YjtiLnByb3RvdHlwZT17Ums6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNrOnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KbTp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm06dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMuUnMoYSl9LApSczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3M6dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRuOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5Jbnx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMuUmsoNCk7KGZ1bmN0aW9uKGMpe2MuWmk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT0KYi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSx0aGlzLmVxPSEwKTt0aGlzLlIoYSk7dGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmVxKXt0aGlzLmNxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksCjUwKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT0KYi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxoYjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7CnZhciBwYT1jLlppfHxwYTsoZnVuY3Rpb24oYyl7Yy5ZaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5hYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYWI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJgoodGhpcy5DYigpLHRoaXMuZ2V0UGxheWVyKCkuUG49ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmZiO2EmJihhLlRkKCksYS5BYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTsKaWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlBmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToKKHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm1jLmxlbmd0aD49dGhpcy5wZCYmdGhpcy5vKCkpfSxKcTpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtmLklzKGEudmlkZW9UYWcpJiYoYS5jcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLllpfHxxYTsoZnVuY3Rpb24oYyl7Yy4kaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmlwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYKIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHBhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5JKGcpfHx0aGlzLmZxKGcpfHwodGhpcy5MKGcpLGc9bmV3IHFhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGlwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy4kaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1rPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs5XTt0aGlzLlNwPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy5IcD1iO2IucHJvdG90eXBlPQp7bGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56aTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB0YT1jLkhwfHx0YSxPYz1uZXcgdGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1PYy5sayg0KTsoZnVuY3Rpb24oYyl7Yy5HbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLk8oYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlIoYik6dGhpcy5IKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTt2YXIgdWE9Yy5HbHx8dWE7KGZ1bmN0aW9uKGMpe2MuRmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHZhPWMuRmx8fHZhOyhmdW5jdGlvbihjKXtjLkhsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYwPGYuRGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9Cm5ldyB1YShnKSx0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyB2YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19KX0pKGMpO3ZhciB3YT1jLkhsfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGc9dGhpcy5hWzldO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzVdO3RoaXMudXQ9dGhpcy5hWzNdO3RoaXMuT2g9dGhpcy5hWzRdO3RoaXMuc289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5IbT1iO2IucHJvdG90eXBlPXtPZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUGc6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kcTp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnV0OnRoaXMuTmgoYSl9LE5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PaDp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB5YT1jLkhtfHx5YSxQYz1uZXcgeWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5PZyg0KTsoZnVuY3Rpb24oYyl7Yy51bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5PKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmI/dGhpcy5SKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5KJiZ0aGlzLkooKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/CmIuYXV0b3BsYXkoKTohMX0samI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLnVsfHx6YTsoZnVuY3Rpb24oYyl7Yy50bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMudW4oKTsKdGhpcy5IYSgpfSxVdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFZiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj0KdGhpcy5TYSgpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLlhiPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlhifSxhcTpmdW5jdGlvbigpe2lmKCF0aGlzLnhmKXt2YXIgYj10aGlzLlNhKCksYT10aGlzLlpwKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LFpwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuV2EoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5XKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sRnU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSx1bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8CmIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFxKCkpe3ZhciBhPXRoaXMuU2EoKSxnPXRoaXMuVmIoKTthJiZnJiYodGhpcy5TYSgpLHRoaXMuVmIoKSx0aGlzLnRkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGQ/dGhpcy5tKCk6KHRoaXMuVyghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuU2EoKX1lbHNlIHRoaXMueWY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fAp0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2bjpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/Cih0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLnpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLnpnLGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxBbjpmdW5jdGlvbigpe3RoaXMuUHV8fCgxMDx0aGlzLkh0Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5IdCsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLlZyKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTApKSl9LFZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5JdCl7dGhpcy5JdD0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQWE9Yy50bHx8QWE7KGZ1bmN0aW9uKGMpe2Mudmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPApmLkRhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IHphKGJbZ10pLGEuamF8fHRoaXMuSShhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgQWEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSDpmdW5jdGlvbigpe3RoaXMucWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5hYyl9fSl9KShjKTt2YXIgQmE9Yy52bHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZpPXRoaXMuYVszXTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLnN0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuZ3I9YjtiLnByb3RvdHlwZT17dWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZpOnRoaXMuSnIoYSl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuS3I6dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5ncnx8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMudWkoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5PKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGhiOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMuWGt8fEVhOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoITApOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy53KCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5tKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWMuYmluZCh0aGlzKSwxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksCnRoaXMubSgpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLnpiJiYodGhpcy56Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWN8fCh0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpOwpiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuZWM9ITAsdGhpcy5tKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMuV2t8fEZhOyhmdW5jdGlvbihjKXtjLllrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmCnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgRWEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEZhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBHYT1jLllrfHxHYSxIYT1uZXcgR2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzRdO3RoaXMudms9dGhpcy5hWzJdO3RoaXMuaHU9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzldO3RoaXMudHI9dGhpcy5hWzNdO3RoaXMucHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbM119Yy5mbz1iO2IucHJvdG90eXBlPXtVbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVm86dGhpcy51ayhhKX0sdWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZrOgp0aGlzLmd1KGEpfSxndTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaHU6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhqOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy50cjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5mb3x8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuVW8oNCk7KGZ1bmN0aW9uKGMpe2MuYmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlOwp0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy5iaHx8SmE7KGZ1bmN0aW9uKGMpe2MuYWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTsKYi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMuYWh8fEthOyhmdW5jdGlvbihjKXtjLmRoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLApkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBKYShkLGEpLHRoaXMuSShkKXx8KGQuTGQoYSksdGhpcy5MKGQpLGQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy5kaHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVsyXX1jLmpqPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54bzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIE5hPWMuamp8fE5hLFNjPW5ldyBOYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53byg0KTsoZnVuY3Rpb24oYyl7Yy51aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5PKGIpO3RoaXMuUihiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJgowPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBPYT1jLnVqfHxPYTsoZnVuY3Rpb24oYyl7Yy50aj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5XYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5sYygpfSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD8KYi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFBhPWMudGp8fFBhOyhmdW5jdGlvbihjKXtjLnZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgT2EoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBQYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgUWE9Yy52anx8UWEsUmE9bmV3IFFhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzRdfQpjLmFuPWI7Yi5wcm90b3R5cGU9e2tuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIFNhPWMuYW58fFNhLFRjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLmtuKDQpOyhmdW5jdGlvbihjKXtjLmJrPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuVWQ9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmRhKCk7cmV0dXJufXRoaXMuTyhhKTsKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUihiKTp0aGlzLmRhKCl9LEVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmIsZz10aGlzLmViKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLlRkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5VZD0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LGpiOmZ1bmN0aW9uKCl7dGhpcy5VZCsrOwppZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sSzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZWE6ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9fSl9KShjKTsKdmFyIFRhPWMuYmt8fFRhOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5nYnx8KHRoaXMuZ2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5nYisrLDE1PHRoaXMuZ2IpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuVmEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMuV28/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsCmZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLldvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5FcihhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgVWE9Yy5ha3x8VWE7KGZ1bmN0aW9uKGMpe2MuY2s9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IFVhKGEsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBWYT1jLmNrfHxWYSxXYT1uZXcgVmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGw9dGhpcy5hWzddO3RoaXMuTG09dGhpcy5hWzVdO3RoaXMuV2g9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsyXTt0aGlzLmpyPXRoaXMuYVsxMF07dGhpcy5SaT10aGlzLmFbOF07dGhpcy5wbD10aGlzLmFbN107dGhpcy54aj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsxMF19Yy5kcz1iO2IucHJvdG90eXBlPXtTbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlRsOnRoaXMuS20oYSl9LEttOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG06dGhpcy5WaChhKX0sVmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldoOnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lbzp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuanI6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJpOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbDp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBYYT1jLmRzfHxYYSxVYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0KVWMuU2woNCk7KGZ1bmN0aW9uKGMpe2MuaWk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLk8oYi5lbGVtZW50KTt0aGlzLlIoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgWWE9Yy5paXx8WWE7KGZ1bmN0aW9uKGMpe2MuaGk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBaYT1jLmhpfHxaYTsoZnVuY3Rpb24oYyl7Yy5qaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgWWEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFphKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgJGE9Yy5qaXx8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsyXTt0aGlzLlhpPQp0aGlzLmFbMTBdO3RoaXMuV3A9dGhpcy5hWzEwXTt0aGlzLmNpPXRoaXMuYVsxXTt0aGlzLkR0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuaHI9YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pazp0aGlzLldpKGEpfSxXaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGk6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2k6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgYmI9Yy5ocnx8YmIsVmM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuaGsoNCk7CihmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0saGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sem46ZnVuY3Rpb24oKXtmLkRmKHRoaXMuRGMpO2YuRWYodGhpcy5EYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpuKCl9LmJpbmQodGhpcyksNTApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgY2I9Yy5UaXx8Y2I7KGZ1bmN0aW9uKGMpe2MuU2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGRiPWMuU2l8fGRiOyhmdW5jdGlvbihjKXtjLlVpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiYKay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBlYj1jLlVpfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQnI9dGhpcy5hWzFdO3RoaXMuem89dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzJdO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuUWs9dGhpcy5hWzldO3RoaXMuJHQ9dGhpcy5hWzJdO3RoaXMuZmg9dGhpcy5hWzVdO3RoaXMuTGk9dGhpcy5hWzEwXTt0aGlzLnltPQp0aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLndtPWI7Yi5wcm90b3R5cGU9e0FyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ccjp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem86dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZyOnRoaXMucG8oYSl9LHBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xbzp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFrOnRoaXMuWnQoYSl9LFp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJHQ6dGhpcy5laChhKX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZoOnRoaXMuS2koYSl9LEtpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaTp0aGlzLnhtKGEpfSx4bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueW06dGhpcy5EbChhKX0sRGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRWw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy53bXx8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuQXIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnBpPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sa206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5waXx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwyMDAhPWYuc3RhdHVzJiYyMDEhPWYuc3RhdHVzfHxnKGYpO2lmKGQmJjQ9PWYucmVhZHlTdGF0ZSYmMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1cylkKGYpO2Vsc2UgaWYoND09Zi5yZWFkeVN0YXRlJiYwPT1mLnN0YXR1cyYmbSYmbS5GZCh0aGlzLklhLnVybCkmJm0uZGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLm1zKCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMucmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZGYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLm5nP3RoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMSk6dGhpcy5OYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCEwKSx0aGlzLktnfHwodGhpcy5OYS53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiZtLkZkKHRoaXMuSWEudXJsKT9tLmRkP20uZ2EoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uRmQodGhpcy5JYS51cmwpLHRoaXMuVGYmJnRoaXMuVGYoKX1yZXR1cm4gdGhpcy5OYX19fSkoYyk7dmFyIGhiPWMucml8fGhiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLk9iPSIiO3RoaXMudWQ9dGhpcy5iYj1udWxsO3RoaXMuYW89dGhpcy5uYj10aGlzLkxmPSExO3RoaXMudWE9IiI7dGhpcy5HZj0hMTt0aGlzLnphPXRoaXMuSmM9IiI7dGhpcy5DZj10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5oYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSGI9IiI7dGhpcy5vYj1bXTt0aGlzLkliPVtdO3RoaXMuR2I9IiI7dGhpcy5sZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNkPSExO3RoaXMuQm49dGhpcy5lZD1udWxsO3RoaXMuZmM9dGhpcy5BZz10aGlzLm5lPXRoaXMuZGQ9dGhpcy52ZD10aGlzLmpjPSExO3RoaXMuUGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fQpjLnNpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLmFvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuR2YsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMuemEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5ZLGlzQmxvY2tlZDp0aGlzLkNmLHNlcnZlcjp0aGlzLk1hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMudGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy55ZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5rZSxIT01BRF9WRVJJRklFRDp0aGlzLnllLEhPTUFEX0JMT0NLRUQ6dGhpcy53ZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5zYiwKSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkJuLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuamMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnZkLHVzZVN0cmljdENoZWNrczp0aGlzLmRkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUGEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMuZmcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuZmN9fSxEcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYKMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxqcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1mLlptKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5PYnx8dGhpcy5iYnx8dGhpcy51ZCkmJihrPXRoaXMuUXEoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5rcChmLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LApPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxaYjpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5NYSYmdGhpcy5NYS5sZW5ndGgmJjA8dGhpcy5NYS5sZW5ndGgmJihiPXRoaXMuTWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGtwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnh1O3JldHVybiJub25lIn0sTGM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYVt0aGlzLmZnXX0sYWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLmpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LFFxOmZ1bmN0aW9uKGEpe3RoaXMuT2ImJgooYSs9dGhpcy5PYik7aWYodGhpcy5iYilmb3IodmFyIGIgaW4gdGhpcy5iYil0aGlzLmJiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmJiW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj1oO3RoaXMuRXEoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuemEpdGhpcy5DcSgpO2Vsc2UgdHJ5e3RoaXMuemE9YigpLHRoaXMud2MoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEVxOmZ1bmN0aW9uKCl7dGhpcy5GYShuZXcgeih0aGlzLkpjK3RoaXMub2MoImdsb2JhbCIpKSwKdGhpcy55cC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxDcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnZkKXt0aGlzLnZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwppZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMud2UpKTt0aGlzLnJiKCk7Zi5UYihsLnVyKTsoYj1mLm9mKHRoaXMuTGMoKSkpfHwoYj1mLm9mKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx5cDpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDsKdGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuemF9ZWxzZSBhPXRoaXMuemE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5NYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMudGY9YS5hZHBhdGh8fCIiO3RoaXMueWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5mZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5NYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiYKdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5hZSgpKSxjPXRoaXMuS2EodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMub2MoImN1c3RvbWVyIikpO3RoaXMuRmEoYix0aGlzLk1zLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNlKCJjdXN0b21lciIpO2E/dGhpcy5Haz90aGlzLmdhKCJub1NWTUNvbmZpZyIpOgoodGhpcy5Haz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LE1zOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLm5lPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuQWc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLm9iPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5zcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMueWQmJih0aGlzLkdiPW51bGwpO3RoaXMubGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5DZCYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuQ2Q9ITAsdGhpcy5RYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5mdCgpJiYodGhpcy5IYnx8dGhpcy5JYnx8dGhpcy5vYnx8dGhpcy5HYik/dGhpcy5aZD8odGhpcy5vYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuc2IpKSwKdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5WcygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLldzKCkpfX0sVnM6ZnVuY3Rpb24oKXt0aGlzLlVzKCl9LFdzOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYShhKSksdGhpcy5yYigpLHRoaXMud2QoKSl9LFVzOmZ1bmN0aW9uKCl7aWYodGhpcy5IYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5xZygpfWVsc2UgdGhpcy5xZygpfSxwZzpmdW5jdGlvbigpe3ZhciBlO3ZhciBjO2Z1bmN0aW9uIGEoKXtlPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlpzKGUsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5pZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuY2QodGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfXRoaXMub2I9bnVsbCx0aGlzLmllKCl9LFpzOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7ZigpJiYKYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy4kcyhlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuSWImJnRoaXMuSWIubGVuZ3RoKXt2YXIgYz10aGlzLkliLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGcoKX0sJHM6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoKXtoKCkmJmIoKX1mdW5jdGlvbiBmKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7bC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtsLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2wub25sb2FkPWU7bC5vbmVycm9yPWY7bC5zcmM9YTtsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChtKXtlKCl9fSxpZTpmdW5jdGlvbigpe3RoaXMuR2I/KHRoaXMua2UrKyx0aGlzLkZhKG5ldyB6KHRoaXMuR2IpLHRoaXMuVHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuamUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5vZygpfSxqZTpmdW5jdGlvbihhKXt0aGlzLmNkKHRoaXMueGUsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVHM6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLm9nKCk6dGhpcy5qZSgiQUFBIil9LG9nOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpO3RoaXMud2QoKX0scmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7Zi5XYSgpJiYoYT0iMSIpO3RoaXMuamMmJihiPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnllKSk7dGhpcy5lZCYmImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSx5bjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuRHAoKSl7dmFyIGE9dGhpcy5qcCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxGYTpmdW5jdGlvbihhLGIsYyxlLGgsSWMpe2E9bmV3IGhiKGEsYixjKTtlJiYoYS5LZz0hMCk7aCYmZi5ncSgpJiYoYS5kZj0hMCk7SWMmJihhLm5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LE9lOmZ1bmN0aW9uKCl7Zi5XYSgpfHxmLlhhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSwKZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtlPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuWmIoKXx8KGE9dGhpcy5LYShlKSxlPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PQpoLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx4bjpmdW5jdGlvbigpe3RoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiOwphLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy55dC5iaW5kKHRoaXMpLHRoaXMueHQuYmluZCh0aGlzKSl9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXtyZXR1cm59Y3x8dGhpcy5MbygpfSx4dDpmdW5jdGlvbigpe30sTG86ZnVuY3Rpb24oKXtmLlRiKGwuS28pO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHdkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMubmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5uYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLm5iW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZmLlhhKGIudXJsLApiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LGZ0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZSxmLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLAplPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGU9MTQ7ZS0tOyljW2JbZV1dPWFbZV18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxmLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGUpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTIwOzM5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT00MDs1OT49ZTtlKyspeD1jKGYsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXg9YyhmLDUpKyhuXnBedykrdCtoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsCmY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuc2l8fGliLG09bmV3IGliO3dpbmRvdy5DdT1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLnlxPXRoaXMuYVsxXTt0aGlzLnJxPXRoaXMuYVs4XTt0aGlzLmtvPXRoaXMuYVs0XTt0aGlzLlV0PXRoaXMuYVs1XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnF0PXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVsxMF07dGhpcy5HbT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs4XX1jLk1wPWI7Yi5wcm90b3R5cGU9e1ZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Xbjp0aGlzLnhxKGEpfSwKeHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlxOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ycTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua286dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlV0OnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5kbDp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXQ6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxwOnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBqYj1jLk1wfHxqYixYYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuVm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5YbT0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5wbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTsKdGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMuanQ9dGhpcy4kYT0hMX1jLmxpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiZ0aGlzLmNvbmZbdGhpcy5MYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLkxhXVthXSk7cmV0dXJuIGJ9LHVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkVhJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLAoiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLmRtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLiRhPWM7aWYodGhpcy5ULlkpdGhpcy5ULnluKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDohMH0pKTp0aGlzLkFhKCk7ZWxzZXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLkpkKGEsYixjKX0sNTApfX0sVmQ6ZnVuY3Rpb24oYSl7dGhpcy5FYz0KITE7dGhpcy5zPWE7dGhpcy51cyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMudXAoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sdXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8ZS5sZW5ndGg7aysrKWVba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLAplW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlP2YuRChsLlJ0LHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk6KGYuS2QoKSxiPT1DLkJlLmNvZGUmJmYuRChsLlVxLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpO2YuRChsLkpvLHRoaXMucy5QLHRoaXMuai51LkIoKSwKdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC56dCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5hdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuZHUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuVnEsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSxmLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGYudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsCiIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sdXM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuVnU9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249CnRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5wbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMubG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLm5tKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5NbigpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnNzKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sc3M6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmZi5vbSh0aGlzLnMub3JpZ2luLnRlKTtmLlphKCJzZXRVcFZwYWlkIik7dmFyIGI9dGhpcy5qLkM7dGhpcy5qLkM9Qi5wb3AoKTtiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuai5DLApiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5qLkcuYXBwZW5kQ2hpbGQodGhpcy5YKTt0aGlzLlgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zLndwKCksYz1hKHRoaXMucy5QLk9yaWdpbmFsQWRQYXJhbWV0ZXJzKSwKZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7Yj1mLnFuKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTXQoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnQoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF0KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB0KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk90KCkpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcykpOwpmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LE50OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LE10OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuWmEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuWmEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuWmEoImZpcnN0UXVhcnRpbGUiKX0sUXQ6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi5aYSgidGhpcmRRdWFydGlsZSIpfSxQdDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5aYSgiY29tcGxldGUiKX0sT3Q6ZnVuY3Rpb24oKXtmLlphKCJhZHN0b3BwZWQiKTt0aGlzLkFhKCl9LGxtOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7dmFyIGU9YixmPXRoaXMuVDsKZi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLkZ0LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxubTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LFhjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IiwKdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG0pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuV2EoKSYmdGhpcy5ULkFnJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5zLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5BYnx8KHRoaXMuQWI9ITAsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLlQuZ2EoInZpZGVvLW5vb3AiKSk7CnJldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLkV0KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9dGhpcy5qLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuS2MucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCmZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5CYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmhlKCkpfS5iaW5kKHRoaXMpOwp0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5abCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LEZ0OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5FZCgpPwp0aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuanQpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm10KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5nZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5rZyk7YyYmKGI9dGhpcy5zLmdlLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwuZW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5wYy5yZXBsYWNlKCJbdGltZV0iLGYuZWYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5wcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5jYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLnduLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0scHA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLlpiKCkmJihmPWguS2EoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7ZS51cmw9ZjthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKd246ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtdDpmdW5jdGlvbihhKXthPT10aGlzLndnfHx0aGlzLkFifHwoMD09YSYmKHRoaXMuJGEmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuJGEpLHRoaXMuJGE9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuV2EoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGYuRChsLmFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi5EKGwuZm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSx0aGlzLlJiJiZmLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLiRsLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC5jbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5EKGwuaG0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSksZi5EKGwuaW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSwKdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnZwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmJxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YuRChsLmJtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSx7YWRJZDp0aGlzLmJkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5JZChlLnVybCxlLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy55YT10aGlzLlhuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5rbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0sdnA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxYbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxFdDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSxFZzpmdW5jdGlvbigpe2YuRChsLkxuLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkVjJiZmLldhKCkmJmYudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZi5lcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMua3QuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5XYi5iaW5kKHRoaXMpKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9lLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtlLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5nZSYmYS5hcHBlbmRDaGlsZChlKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LmhiJiZ0aGlzLmoudS5oYigpJiZ0aGlzLlJxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxsdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEJiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5jYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhkKCl9ZWxzZSB0aGlzLnhkKCl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMDt0aGlzLmouc2YoKTsKdGhpcy5qLlpyKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5XcigpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGYuRWYodGhpcy52aWRlbyxhKT90aGlzLllyKCk6dGhpcy5UZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmxpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVs4XTt0aGlzLmdpPXRoaXMuYVsyXTt0aGlzLkJvPXRoaXMuYVsxMF07dGhpcy5KbD10aGlzLmFbN107dGhpcy5Iaj10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLlFtPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/CnRoaXMuRG86dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk9yOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5naTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQm86dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iajp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy5RbXx8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuYWE9bnVsbDt0aGlzLk1iPSExO3RoaXMudGU9IiI7dGhpcy5zZT0hMTtkJiZkLmVtcHR5P3RoaXMuSXEoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5zbD1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5XZSgpLGI7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS5UYShtLktzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSHEuYmluZCh0aGlzKSx0aGlzLkRxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkVhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5FYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuRWEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwKMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxIcTpmdW5jdGlvbihhKXt0aGlzLlByKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSXE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQmEoeC5rZCkpfXRoaXMuYmE9dGhpcy5mZigpO3RoaXMuTWI9dGhpcy5yZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuUmMoKTp0aGlzLmZhKHRoaXMuQmEoeC5nYyx7ZXJyb3I6dGhpcy5zZT9DLmpkOkMuQWV9KSl9LERxOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkJhKHguemUse2RlcHRoOmF9KSl9LFJjOmZ1bmN0aW9uKCl7dGhpcy5hYT10aGlzLmJhLnNoaWZ0KCk7dGhpcy5pcSgpP3RoaXMuYXQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy52dCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSx2dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLllzKCk/dGhpcy5YcygpPyEwOigtMSE9dGhpcy5VYigpPwp0aGlzLmZhKHRoaXMuQmEoeC52ZSkpOnRoaXMuZmEodGhpcy5CYSh4Lm5oKSksITEpOih0aGlzLmZhKHRoaXMuQmEoeC5nYyxDLkJlKSksITEpfSxWZDpmdW5jdGlvbihhKXthLnlhPWEueWEuY29uY2F0KHRoaXMuTWQoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy5NYjt0aGlzLnBhcmVudC5WZChhKX0sU246ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbGI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMubGYoKTthLnZjPXRoaXMuZnAoKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLmJwKCk7YS5nZT10aGlzLnRwKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLmhwKCkpOmIueWEuY29uY2F0KHRoaXMubnAoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksCmE9MCx0aGlzLlJjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYSYmdGhpcy5wYXJlbnQuZmEoYiksYT0wKX0seGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQueGIoYSl9LCRlOmZ1bmN0aW9uKGEsYil7dGhpcy5mYSh0aGlzLkJhKGEsYikpfSxCYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBtYihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGF0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sWXM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxYczpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sUHI6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuc2U9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnFmKCkubGVuZ3RofSxxZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFwKHRoaXMuYWEsIlZBU1RBZFRhZ1VSSSIpfSxNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sCm5wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LGhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxmcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnliKHRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApBdTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy55YihhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LGJwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0KIiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMucmYoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2YucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sdHA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5GcyhnLGEpLDA+CmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxxcDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMueWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHhwOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx5YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJmKGEpOiIifSxyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnhwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5zbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gbj10aGlzLmFbMV07CnRoaXMuZnM9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzhdO3RoaXMuUWo9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy53aD1iO2IucHJvdG90eXBlPXtFbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRm46dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZzOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qbzp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBuYj1jLndofHxuYixaYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT0KW107dGhpcy52Yz0iIjt0aGlzLlA9dGhpcy52Yj0hMTt0aGlzLm9yaWdpbj1udWxsfWMubms9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sd3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBsYj1jLm5rfHxsYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scj10aGlzLmFbNl07dGhpcy5ZaD10aGlzLmFbMTBdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOV19Yy5IaD1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlloOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56cjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIG9iPWMuSGh8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5rcig0KTt2YXIgeD17a2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LG5oOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxnYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxDZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHplOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0saGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnB1Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSx2ZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17QWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sQmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0scnU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubnI9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbM119Yy5hcj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5yOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMuYXJ8fHBiLGFkPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLm1yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5LaD1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMuS2h8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naz10aGlzLmFbOF07dGhpcy5MbD10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbMTBdO3RoaXMuZW49dGhpcy5hWzldO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbMl19Yy5Maz1iO2IucHJvdG90eXBlPXtmazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2s6dGhpcy5LbChhKX0sS2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkpwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5Ma3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PWJkLmZrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMudGg9YjtiLnByb3RvdHlwZT17Z2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLiRwKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PQp3aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2UmJihoLnBvc2l0aW9uPWUpO3JldHVybiBofSxMczpmdW5jdGlvbigpe3RoaXMuSWY9ITB9LHlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sVmY6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtmLkQobC55Yyx0aGlzLnUuQigpKX0sWnI6ZnVuY3Rpb24oKXt0aGlzLklmfHwodGhpcy51LnBsYXkoKSxmLkQobC56Yyx0aGlzLnUuQigpKSl9LGNjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKwoicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlFhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUWEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUWEpO3RoaXMudS5EYiYmdGhpcy51LkRiKCk/dGhpcy51LmdmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy51Zi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sJHA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGdwOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LHVmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5RYSk7aWYoYi54IT10aGlzLlJhLnh8fGIueSE9dGhpcy5SYS55fHxiLnBvc2l0aW9uIT10aGlzLlJhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlJhLndpZHRofHxiLmhlaWdodCE9dGhpcy5SYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5SYS53aWR0aCYmMDx0aGlzLlJhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuc2YoKTtyZXR1cm59dGhpcy5SYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLnZmLmxlbmd0aDthKyspdGhpcy52ZlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxzZjpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkcpO3RoaXMuQyYmdGhpcy5DLnBhdXNlJiZ0aGlzLkMucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBOPWMudGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0KImJsb2NrIjtMLmlkPWYucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLFk9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vbz10aGlzLmFbOF07dGhpcy4kZz10aGlzLmFbMTBdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuQW09dGhpcy5hWzEwXTt0aGlzLkVtPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzhdfWMuZXQ9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9vOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kZzp0aGlzLnZzKGEpfSwKdnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLndzOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQW06dGhpcy5EbShhKX0sRG06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgc2I9Yy5ldHx8c2IsY2Q9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2Qubm8oNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpOwp0aGlzLk8oYSk7dGhpcy5mZShiKTt0aGlzLlhlKCl9LGZlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQ2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlIoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQ2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB0Yj1jLlVqfHx0YjsoZnVuY3Rpb24oYyl7Yy5Uaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9WigpO3RoaXMudWI9dGhpcy51Ynx8ITE7dGhpcy5HZT10aGlzLkplPXRoaXMuemY9dGhpcy5pYT10aGlzLm1lPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLApiKXt0aGlzLlhvKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5tZT0hMDt0aGlzLnpmJiZ0aGlzLlJlKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZmI7YSYmYS5ZYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy56Zj0hMDt0aGlzLlJlKCl9LmJpbmQodGhpcykpO3RoaXMuTmUoKX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy51Yil7dGhpcy50YygpO2lmKCF0aGlzLm1lJiYhdGhpcy50YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwKMTAwKSwhMDt0aGlzLm1lJiZ0aGlzLkdlJiYhdGhpcy5KZSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19LHRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxtZjpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxOZTpmdW5jdGlvbigpe2lmKHRoaXMudGMoKSl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkplPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuR2U9Yi53dX10aGlzLmhhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmUoKX0uYmluZCh0aGlzKSwxMDApfSxEdTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5RdSgpOiExfSxVYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuVWIoKTotMX0sb3A6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sWG86ZnVuY3Rpb24oYixhKXt0aGlzLnViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMudWJ8fDMwMj09dGhpcy51Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy51Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX0seGM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPyh0aGlzLm0oKSx0aGlzLm5hKCkpOmIuTmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciB1Yj1jLlRqfHx1YjsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGhxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLnJrLldsLlVsP3dpbmRvdy5PTy5yay5XbC5VbC51dShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ocSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPVooKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxmLkRhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB0YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgdWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIHZiPWMuVmp8fHZiLHdiPW5ldyB2YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcT10aGlzLmFbOF07dGhpcy5Ibj10aGlzLmFbNV07dGhpcy5DbT10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs3XX1jLlZpPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLkduKGEpfSwKR246ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5DbTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3U6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy5WaXx8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuTHEoNCk7KGZ1bmN0aW9uKGMpe2MuVWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5Va3x8eWI7KGZ1bmN0aW9uKGMpe2MuVGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp5LnFkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuYnIoYSl9LmJpbmQodGhpcykpO3kuQ3AoKX0sYnI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7CnRoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgemI9Yy5Ua3x8emI7KGZ1bmN0aW9uKGMpe2MuVms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuJG4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9CltdKTt0aGlzLlNjLnB1c2goYlthXSk7dmFyIGU9bmV3IHliKGQpO3RoaXMuSShlKXx8KHRoaXMuTChlKSwobmV3IHpiKGUsdGhpcy5BKSkuYigpKX1jYXRjaChoKXt9fX10aGlzLkgoKX0scWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuWnx8KHRoaXMuWj17fSk7dGhpcy5aW2JdfHwodGhpcy5aW2JdPXt9KTt0aGlzLlpbYl1bYV18fCh0aGlzLlpbYl1bYV09W10pO3RoaXMuWltiXVthXS5wdXNoKGMpfSxidDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMuWHIoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSwKQ3A6ZnVuY3Rpb24oKXtpZih0aGlzLiRiKWZvcih2YXIgYj0wO2I8dGhpcy4kYi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLiRiW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5aW2NdW2RdJiYwPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ0KGIpfX0pfSkoYyk7dmFyIEFiPWMuVmt8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaj0KdGhpcy5hWzNdO3RoaXMub3U9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5taD1iO2IucHJvdG90eXBlPXtFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm91OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgQmI9Yy5taHx8QmIsZWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRWooNCk7KGZ1bmN0aW9uKGMpe2MuZ2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0samI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLmdofHxDYjsoZnVuY3Rpb24oYyl7Yy5oaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkNyfHwodGhpcy5Dcj0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5oaHx8RGI7KGZ1bmN0aW9uKGMpe2MuaWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgQ2IoZCk7dGhpcy5JKGYpfHwodGhpcy5MKGYpLChuZXcgRGIoZix0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5IKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5paHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maj10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbMTBdO3RoaXMuYmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbM119Yy5Fbz1iO2IucHJvdG90eXBlPXtLajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTGo6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlpuOnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaDp0aGlzLmFqKGEpfSxhajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYj1jLkVvfHxHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC5Laig0KTsKKGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLnlsfHxIYjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy5ab3x8KHRoaXMuQWYoKSx0aGlzLlpvPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLkxlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5MZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLAo1MDApKX0sY3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jcCgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5vKCksdGhpcy5sKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZigpfS5iaW5kKHRoaXMpLDUwKX0sT3U6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBJYj1jLnhsfHxJYjsoZnVuY3Rpb24oYyl7Yy56bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5MKGMpLChuZXcgSWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEpiPWMuemx8fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy5RcD10aGlzLmFbN107dGhpcy5SbD10aGlzLmFbN107dGhpcy5VcD10aGlzLmFbMTBdOwp0aGlzLiRrPXRoaXMuYVs1XTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuVmc9YjtiLnByb3RvdHlwZT17Um06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNtOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcDp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmw6dGhpcy5UcChhKX0sVHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlVwOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kazp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLlZnfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9Z2QuUm0oNCk7KGZ1bmN0aW9uKGMpe2MuaGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYoMCx0aGlzLkopKCEwKX0uYmluZCh0aGlzKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTsKdmFyIE1iPWMuaGp8fE1iOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZ20oKX0uYmluZCh0aGlzKSksdGhpcy5KZz0hMSx0aGlzLlN0PQoxRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLlN0KSl9LGdtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTsKYltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy5nanx8TmI7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8CndpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpO3ZhciBPYj1jLmlqfHxPYixQYj1uZXcgT2IocSk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs5XTt0aGlzLmxxPXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVsxMF07dGhpcy5KaD10aGlzLmFbN107dGhpcy5PcD10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52aDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy54aChhKX0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnloOnRoaXMuSWgoYSl9LEloOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLlNxfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTmt8fFJiOyhmdW5jdGlvbihjKXtjLk1rPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLkdkKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLAoxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLk1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5Paz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmCiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIFRiPWMuT2t8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbMTBdO3RoaXMuSmk9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy4kcj1iO2IucHJvdG90eXBlPXtFaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmk6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkppOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5QbTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOgphfX19KShjKTt2YXIgVmI9Yy4kcnx8VmIsaWQ9bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aWQuRWkoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuV2Q9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkZyKCl9LmJpbmQodGhpcyksNTAwKX0sRnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJgpiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2QmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuV2QpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwKInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sSHM6ZnVuY3Rpb24oKXt0aGlzLldkPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgV2I9Yy5Fa3x8V2I7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLktiPTB9LGI6ZnVuY3Rpb24oKXt0aGlzLk5xPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMuS2J8fHRoaXMuS2IrKyx0aGlzLktiPD10aGlzLk5xPyh0aGlzLktiKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IcygpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgWGI9Yy5Ea3x8WGI7KGZ1bmN0aW9uKGMpe2MuRms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IFdiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFhiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgWWI9Yy5Ga3x8WWIsWmI9bmV3IFliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLkRpPXRoaXMuYVs5XTt0aGlzLlFzPXRoaXMuYVsxMF07dGhpcy4kaj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkJoPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nbjp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVGg6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOgp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgJGI9Yy5CaHx8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuZm4oNCk7KGZ1bmN0aW9uKGMpe2Muems9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5PKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlIoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLkooKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy56a3x8YWM7KGZ1bmN0aW9uKGMpe2MueWs9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkNhKCk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkljKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5CcSgpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxObjpmdW5jdGlvbigpe3RoaXMuRmUoKXx8dGhpcy5vKCEwKX0sQnE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5JYygpOyFiLm1hJiZiLmJhJiZiLnR1JiZiLnZ1JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkNhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10uaWQ9PQphKXJldHVybiBiW2NdO3JldHVybnt9fSxHZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxvOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5JYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLnlrfHxiYzsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSlmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IGJjKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBjYz1jLkFrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzFdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMud3E9dGhpcy5hWzldO3RoaXMubGg9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ibz1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR2g6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNrOnRoaXMuQ2goYSl9LENoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EaDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3E6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMuYm98fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWtkLkZoKDQpOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuTyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5SKGEpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sSzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQ2E6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmCih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVD1jLnJqfHxUOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlhkPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGQ9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5YZCYmYiE9dGhpcy5YZHx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKGsuYWRUYWc9YS5hZFVSTCksdGhpcy5sKCJhZGVycm9yIixhLlN1KSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVPWMucWp8fFU7KGZ1bmN0aW9uKGMpe2Muc2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEQpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgVChiKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgVShiLHRoaXMuQSksYi5iKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFQoYiksYi5qYT90aGlzLmNnKCk6dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBELGZjPWMuc2p8fGZjLGdjPW5ldyBmYyhmdW5jdGlvbihjLGIpe2MucGF1c2UoKTtpZihtLm5iLmxlbmd0aCl7dmFyIGE9bS5uYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9Zi5wcyh7IltMT0FEU0NSSVBUXSI6Zi5wYSgxMCksIltVVElMU10iOmYucGEoMTApLCJbQ0FMTEJBQ0tdIjpmLnBhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09Zi5NZi5iaW5kKGYpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKWtbZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWYuTWYoZywKZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obz10aGlzLmFbNV07dGhpcy5Fcz10aGlzLmFbOV07dGhpcy5tbz10aGlzLmFbMV07dGhpcy56aj10aGlzLmFbM107dGhpcy5pbz10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbOF07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbM107dGhpcy5maj10aGlzLmFbMl07dGhpcy5nPXRoaXMuYVsyXX1jLnRpPWI7Yi5wcm90b3R5cGU9e01vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Obzp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRXM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5tbzp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Jazp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBsOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhjPWMudGl8fGhjLGxkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLk1vKDQpOyhmdW5jdGlvbihjKXtjLmdsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuTyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlIoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlRxPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxnczpmdW5jdGlvbihiKXt0aGlzLm5kPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UcX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sSzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJih0aGlzLkomJnRoaXMuSigpLHRoaXMubmQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm5kJiYobmV3IEcodGhpcyx0aGlzLm5kKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuZ2x8fE07KGZ1bmN0aW9uKGMpe2MuZmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5BZClpZih0aGlzLmdifHwodGhpcy5nYj0wKSx0aGlzLmdiKyssMTU8dGhpcy5nYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHRoaXMucnMoKSwhMDt0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm8oKTp0aGlzLm8oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEc9Yy5mbHx8RzsoZnVuY3Rpb24oYyl7Yy5obD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy53YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYi5ncyh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgaWM9Yy5obHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm11PXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMudG89YjtiLnByb3RvdHlwZT17bHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm11OnRoaXMubW4oYSl9LG1uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMudG98fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5sdSg0KTsoZnVuY3Rpb24oYyl7Yy5vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5VZT0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5SKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSwKe2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3JuOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuVWU9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3JuOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5vanx8bGM7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sV3U6ZnVuY3Rpb24oKXt9LFJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWUobmV3IGZ1bmN0aW9uKCl7fSk7YS5xdT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5ScihhKTsKd2luZG93Lnl1PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLlFyfHwodGhpcy5Rcj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRkfHwodGhpcy5EZD0xKTtpZigyMDx0aGlzLkRkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5EZCsrOwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmCmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuVyghMCl9LmJpbmQodGhpcykpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMubmp8fG1jOyhmdW5jdGlvbihjKXtjLnBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgbmM9Yy5wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmpuPXRoaXMuYVs0XTt0aGlzLnRtPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzhdfWMuRWg9YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbjp0aGlzLnNtKGEpfSwKc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgcGM9Yy5FaHx8cGMsbmQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bmQuTW0oNCk7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKTthJiZ0aGlzLk8oYS5wYXJlbnROb2RlKX0sSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFY9Yy5sanx8VjsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy53Zj0wO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT10aGlzLlhiPXRoaXMuVmE9dGhpcy5xYz0hMTt0aGlzLmFnPWYua2IoMTApO3RoaXMuRmYoKX0sRmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm8oITApOnRoaXMubygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmYuYmluZCh0aGlzKSwxMDApLCExfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSwKdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBXPWMua2p8fFc7KGZ1bmN0aW9uKGMpe2MubWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFYod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7CmVsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBWKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIHFjPWMubWp8fHFjLHJjPW5ldyBxYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VZz10aGlzLmFbNF07dGhpcy5waD10aGlzLmFbNV07dGhpcy5sbD10aGlzLmFbMl07dGhpcy5Eaj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs1XX1jLmtpPWI7Yi5wcm90b3R5cGU9e1RnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VZzp0aGlzLm9oKGEpfSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucGg6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sbDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGo6dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVpOnRoaXMuUW8oYSl9LFFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Sbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMua2l8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLlRnKDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLk8oYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5RaHx8dGM7KGZ1bmN0aW9uKGMpe2MuUGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsCmZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5vKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5QaHx8dWM7KGZ1bmN0aW9uKGMpe2MuUmg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGYuRGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkkoZCl8fCh0aGlzLkwoZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkgoKX19KX0pKGMpO3ZhciB2Yz1jLlJofHx2Yyx3Yz1uZXcgdmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJsPXRoaXMuYVsxMF07dGhpcy54az10aGlzLmFbM107dGhpcy5XbT10aGlzLmFbM107dGhpcy5jbj10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbM107dGhpcy50bj10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLnZyPWI7Yi5wcm90b3R5cGU9e0FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CbDp0aGlzLndrKGEpfSx3azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGs6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldtOnRoaXMuYm4oYSl9LGJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jbjp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua2s6dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRuOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgeGM9Yy52cnx8eGMscGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuJGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLk8oYiksdGhpcy5SKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHljPWMuJGh8fHljOyhmdW5jdGlvbihjKXtjLlpoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlBlKCl9LFBlOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5aaHx8emM7KGZ1bmN0aW9uKGMpe2MuYWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5qYSl7dGhpcy5IKCk7cmV0dXJufWlmKCF0aGlzLkkoYikpe3RoaXMuTChiKTsobmV3IHpjKGIsdGhpcy5BKSkuYigpO3RoaXMuSCgpO3JldHVybn19dGhpcy5IKCl9fSl9KShjKTt2YXIgQWM9Yy5haXx8QWMsQmM9bmV3IEFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsyXTt0aGlzLkNzPXRoaXMuYVsxXTt0aGlzLnRrPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVsxMF07dGhpcy5laz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs5XX1jLmpxPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IaTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRrOnRoaXMuY3IoYSl9LGNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuZHI6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5qcXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGY9dGhpcy5LZj10aGlzLkpmPSExO3RoaXMuVWM9W107dGhpcy4kZD17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcmM/bnVsbDpyYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBGYj9udWxsOkZiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFViP251bGw6VWIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHdiPwpudWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB4YT9udWxsOnhhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE1hP251bGw6TWEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgbmE/bnVsbDpuYX19Yy5waz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnJwKGEpOltdLGI7dGhpcy5LZj0hMDtpZihhLmxlbmd0aCl7dGhpcy5KZj0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPQphW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxycDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZFtjXSx0aGlzLm9lKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEpe3RoaXMub2UoYSkmJmEuYigpfSxKczpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuSmYpZm9yKHRoaXMuSGY9ITAsYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXRoaXMuVWNbYV0ucWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5VY1thXS5xYil9fX0pKGMpO3ZhciBEYz1jLnBrfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Q9dGhpcy5hWzRdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMV19Yy53bD1iO2IucHJvdG90eXBlPXtWdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3Q6dGhpcy5pdShhKX0saXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmp1OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qbDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEVjPWMud2x8fEVjLHJkPW5ldyBFYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLlZ0KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZi5UYihsLnd0KSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5UYihsLldxKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxiYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRj1uZXcgZ2Esaz0hMTtGLk1jKCk7Ri5CZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuTWMoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkJmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5NYygpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2YuZmlyZUV2ZW50KHdpbmRvdyxGLlhwKCkse2lkOnRkfSl9LDUwMCk7YWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bz10aGlzLmFbMV07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMueXM9dGhpcy5hWzEwXTt0aGlzLkpqPXRoaXMuYVsyXTsKdGhpcy5vdD10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzEwXTt0aGlzLklvPXRoaXMuYVsxXTt0aGlzLm5sPXRoaXMuYVs0XTt0aGlzLmFwPXRoaXMuYVs0XTt0aGlzLmRqPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzZdfWMuTWo9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZvOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5mdTp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Kajp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3Q6dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJqOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6CnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hcDp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLk1qfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC51byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmY9dGhpcy5jb25mPXRoaXMuVWE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLlBjPTA7dGhpcy5MYT0iIjt0aGlzLlZjPVtdO3RoaXMuV2M9MDt0aGlzLiRmPSExO3RoaXMuWWQ9W119Yy5MZz1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXt0aGlzLlpmPWF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGpzOmZ1bmN0aW9uKGEpe3RoaXMuVWE9YX0saHM6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5MYV0mJnRoaXMuY29uZlt0aGlzLkxhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTGFdW2FdKTtyZXR1cm4gYn0sYmM6ZnVuY3Rpb24oYSxiKXtmLmliKCJ3ZWx0LmRlIikmJmYuWGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpOwp2YXIgYz0hMSxlPSExO2lmKHRoaXMuWXAoKSl0aGlzLlVhLmModGhpcy5VYS5KYyx0aGlzLlVhLnphLHRoaXMuVWEuWmQsZnVuY3Rpb24oKXt0aGlzLmJjKGEsYil9LmJpbmQodGhpcyksdGhpcy5VYS5CYyk7ZWxzZSBpZih0aGlzLkVwKCkpdGhpcy5jcyhmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YuRChsLnljLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkxzKCk7ay5leGl0RnVsbHNjcmVlbigpO1E9az1uZXcgTyhrLHRoaXMuVWEsaCk7ay5nZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5LcShhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpOwpoLmFkU3RhcnRUaW1lb3V0JiYoZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5KZChhLGMsZSk7dGhpcy5wbGF5ZXIuaGcoayl9fSxZcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlBjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuUGMuZ2V0VGltZSgpLHRoaXMuUGM9YSwzRTU8Yj8hMDohMTt0aGlzLlBjPWE7cmV0dXJuITF9LEFzOmZ1bmN0aW9uKCl7Zi5lZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmFmKGEpKT90aGlzLmJjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfSx6czpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLm9zKCEwKTsKdmFyIGI9dGhpcy5jb25mLGM9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5hZihjKSk/dGhpcy5iYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9fSxhZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sVHI6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50cyh0aGlzLnpzLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmVhKCl9LCRjOmZ1bmN0aW9uKGEpe2YuZWUoIm1pZHJvbGwiKTtpZighdGhpcy5PZil7dGhpcy5PZj0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuYmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2Y9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LFNyOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIubnModGhpcy4kYy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5BcygpO3RoaXMucGxheWVyLk5kJiZ0aGlzLlNyKCk7dGhpcy5UcigpfSxVcjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLlZjLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5rdShhLGIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlciwKYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLldjPXRoaXMuVmMubGVuZ3RofSxFcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5XYyYmKGE9ITApO3JldHVybiBhfSxjczpmdW5jdGlvbihhKXt0aGlzLiRmPWE7Zm9yKGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl0aGlzLlZjW2FdWyJmdW5jdGlvbiJdKHRoaXMuSXIuYmluZCh0aGlzKSl9LElyOmZ1bmN0aW9uKGEpe3RoaXMuV2MtLTthJiZ0aGlzLllkLnB1c2goYSk7MD49dGhpcy5XYyYmdGhpcy4kZigpfSxLcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5ZZC5sZW5ndGg7YysrKWI9dGhpcy5ZZFtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZGE9Yy5MZ3x8ZGEsUT0hMSxqYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaD10aGlzLmFbN107CnRoaXMuWGc9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMucG49YjtiLnByb3RvdHlwZT17emg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFoOnRoaXMuV2coYSl9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdjPWMucG58fEdjLHZkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnpoKDQpfSkuY2FsbChWb3B1V3VpdlhhaExpb1llLFZvcHVXdWl2WGFoTGlvWWUpOwo=
Protocol
HTTP/1.1
Server
54.230.44.222 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-54-230-44-222.fra6.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
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://www.chip.de

Response headers

Date
Mon, 02 Jul 2018 09:53:17 GMT
Via
1.1 6fd049110ebc3ac6deddab8b0bf5d686.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
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
FLshr-PxB7OYqa4Uoi-OOF9alzBjPY7ssH_geoS4UIj_W2i5ov7mPg==
Expires
0
gen_204
pagead2.googlesyndication.com/pagead/
0
442 B
Image
General
Full URL
http://pagead2.googlesyndication.com/pagead/gen_204?error=1012&vis=1&lid=7&sdkv=h.3.220.0&id=ima_html5&c=3983414213359471&domain=www.chip.de
Protocol
HTTP/1.1
Server
2a00:1450:4001:815::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (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
/
ssl.1.damoh.chip.de/cf27cf87a12662183f7aabeca97c28ca34b5cc01/
422 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.chip.de/cf27cf87a12662183f7aabeca97c28ca34b5cc01/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvcHVXdWl2WGFoTGlvWWU9Vm9wdVd1aXZYYWhMaW9ZZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWGEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLmpzKG0pLGEuaHMoayksYS5VcigpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2o9dGhpcy5hWzFdO3RoaXMuUmc9dGhpcy5hWzZdO3RoaXMuUGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNF19Yy5OZz0KYjtiLnByb3RvdHlwZT17Tmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9qOnRoaXMuUWcoYSl9LFFnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SZzp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYT1jLk5nfHxlYSxIYz1uZXcgZWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1IYy5Oaig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5FYT0ic2V0dXAiO3RoaXMuZGM9W107dGhpcy5TZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkhyLmJpbmQodGhpcykpfWMubmk9YjtiLnByb3RvdHlwZT17U2U6ZnVuY3Rpb24oKXt0aGlzLmxhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LG9tOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YS5wb3N0TWVzc2FnZShiLCIqIil9LEdhOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxIcjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5HcihhLmRhdGEpfSxHcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMubGEuZXZlbnRsaXN0ZW5lci5sZW5ndGg7YisrKWEuZXZlbnQ9PQp0aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSxyZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxtbTpmdW5jdGlvbihhLGIpezA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sYmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7Zm9yKHZhciBkPTA7ZDx0aGlzLmxhLmVycm1zZy5sZW5ndGg7ZCsrKWIrPSJcbiIrdGhpcy5sYS5lcnJtc2dbZF07dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxEYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT0KdHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxoZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSXM6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sRGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9MCxjPTAsaD0wLGY9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7ZT11LmhlaWdodDswPnUudG9wJiYoZSs9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZS09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYKKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5lJiYoZT0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCplKTtoPj1iJiYoZj0hMCk7cmV0dXJuIGZ9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSwKQmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGU7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZT1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitlLGJ8PTA7cmV0dXJuIGJ9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGcrPWUudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxjLGg9QXJyYXkoODApLGY9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZT0wO2U8bi0zO2UrPTQpYz1hLmNoYXJDb2RlQXQoZSk8PDI0fGEuY2hhckNvZGVBdChlKzEpPDwxNnxhLmNoYXJDb2RlQXQoZSsyKTw8OHxhLmNoYXJDb2RlQXQoZSszKSwKcC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGUpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKyloW2VdPXBbYStlXTtmb3IoZT0xNjs3OT49ZTtlKyspaFtlXT1kKGhbZS0zXV5oW2UtOF1eaFtlLTE0XV5oW2UtMTZdLDEpO2M9ZjtuPXU7bD1rO3c9STtxPW07Zm9yKGU9MDsxOT49ZTtlKyspcj1kKGMsNSkrKG4mbHx+biZ3KStxK2hbZV0rMTUxODUwMDI0OSYKNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTIwOzM5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT00MDs1OT49ZTtlKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXI9ZChjLDUpKyhuXmxedykrcStoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2Y9ZitjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihmKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx3YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxlLGMsaCxmLHUsaz0wO2s8YS5sZW5ndGg7KWQ9CmEuY2hhckNvZGVBdChrKyspLGU9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LGY9KGUmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGUpP2Y9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sZ3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZT0hMSxjPSExLGg9ITEsZj0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtlPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRtPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGY9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1lO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1mO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxlcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuV2UoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxXYTpmdW5jdGlvbigpe3ZhciBhPXtZZzpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKamg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sWWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFltOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWcoKXx8YS5qaCgpfHxhLkdwKCl8fGEuWWooKXx8YS5DbCgpfX07cmV0dXJuIGEuWW0oKX0sS2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbYltlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGU9MCxjPWEubGVuZ3RoO2U8YzsrK2UpYi5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxiW2FbZV1dPTEpO3JldHVybiBkfSxvZjpmdW5jdGlvbihhKXthPXRoaXMuS2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSwkbjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxlPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8ZS5wdXNoKGFbY10pO3JldHVybiBlfSxGczpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGU9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZT1hLnNwbGl0KCIlIiksZD1iLzEwMCplKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGVmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54ZyhiKSsiOiIrdGhpcy54ZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZTpmdW5jdGlvbihhKXt0aGlzLkVhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU7ZC5zdGF0ZT10aGlzLkVhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2U9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGUpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxlLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5GYyhiLGQpKTtiJiYoaD1sLkZjKGEsYikpO2UmJihoPWwuRmMoaCxlKSk7YyYmKGg9bC5GYyhoLGMpKTtmLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBlPW0uYWUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uVGEoZSwhMCk7ZT1tLlRhKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRmEoZSxmdW5jdGlvbihkKXt2YXIgZT0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZT0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZT0hMSl9Y2F0Y2goYyl7fWV8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLAooZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oKXttJiZtLlk/bS5pc0VuYWJsZWQmJm0ueG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2QoKX0uYmluZCh0aGlzKSw1MDApfSxxbjpmdW5jdGlvbihhLGIpe2lmKGIuT2MoYSl8fCJhYm91dDpibGFuayI9PWF8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLmJmKGEpKXJldHVybiB0aGlzLmJmKGEpO3ZhciBkPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2QuaG9tYWRfdXJsX3N1ZmZpeD0KYTtkLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoYSk7ZC5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2QuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt2YXIgZT0hMSxjPSExLGM9dGhpcy5YYShhLGIudWEsZCxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWMpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMubW0oZSxhKTtyZXR1cm4gZX0sWGE6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZix1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suVGEoYSxoKTtoPWsuVGEoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5GYShoLGUsYywiIiwiIixmKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoYSxiLGQsZSxjLGssZix1KX0uYmluZCh0aGlzKSw1MDApfSxGcTpmdW5jdGlvbihhLGIsZCxlLGMsaCxmKXt2YXIgdT0hMDtmJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtmPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZilkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGZba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZShsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sR3E6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRnEoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZGMpZm9yKHZhciBjIGluIHRoaXMuZGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5kY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2Yud2IoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTWY6ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5YYShhLGUudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkdxKGUuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZSwhMCl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRjPWF9LGt1OmZ1bmN0aW9uKGEsYixkLGUsYyl7dGhpcy5YYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmV9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX0pfSxabTpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LGJxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLm5pfHxQO25ldyBQO3ZhciBmPW5ldyBQO3dpbmRvdy5CdT1mOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1pPWI7Yi5GYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGU7Zm9yKGUgaW4gYilkW2VdPWJbZV07Zm9yKGUgaW4gYSlkW2VdPWFbZV07cmV0dXJuIGR9O2IudXI9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnE9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ0PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuSm89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZtPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLiRsPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5jbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5obT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWmw9e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLmFtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuenQ9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVxPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLktvPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdT17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Mbj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlFuPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuemM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuZW09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5JZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuSGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuaW09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5ibT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iud3Q9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5XcT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMubWl8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHI9dGhpcy5hWzVdO3RoaXMuQXE9dGhpcy5hWzRdO3RoaXMuS249dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19CmMudXE9YjtiLnByb3RvdHlwZT17b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnByOnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5BcTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgZmE9Yy51cXx8ZmEsSmM9bmV3IGZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMub3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5vaT1iO2IucHJvdG90eXBlPXtCZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZSxjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBNYXRoLmFicyhiKX0sCmViOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxtcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxHYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTsKaWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxNYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5HYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYygpKyIyIn0sQmY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLm1wKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09CmIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5vaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueHI9dGhpcy5hWzhdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMuS2s9dGhpcy5hWzRdO3RoaXMudm09dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzVdO3RoaXMuZHQ9dGhpcy5hWzddO3RoaXMubnE9dGhpcy5hWzVdO3RoaXMuQmk9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbN119Yy5VaD1iO2IucHJvdG90eXBlPXt3cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueHI6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ0OnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lazp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudm06dGhpcy5hcyhhKX0sYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5iczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZHQ6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5xOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhhPWMuVWh8fGhhLEtjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLndyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGU9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZVtjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGdbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5pO3RoaXMuaT1kW2FdO3ZhciBlPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaT1nO3JldHVybiBlfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBlLmM/ZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2UuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1lO2UuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51ZT1ifSkoYyk7dmFyIEo9Yy51ZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbOF07dGhpcy54aT10aGlzLmFbOF07dGhpcy5ycj10aGlzLmFbNl07dGhpcy5odD0KdGhpcy5hWzNdO3RoaXMuVG89dGhpcy5hWzEwXTt0aGlzLllxPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuR3M9YjtiLnByb3RvdHlwZT17TWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5pOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGk6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJyOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odDp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVG86dGhpcy5YcShhKX0sWHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLkdzfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuTWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5vaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5rcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGtzOmZ1bmN0aW9uKGIpe3RoaXMuQT0KYn0sbHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxMOmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5lYigpXT1iO0smJksuS2YmJksuSnMoYil9LEp1OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmViKCldPyEwOiExfSxmcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFh1OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMub2t8fHI7KGZ1bmN0aW9uKGMpe2MucWs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9Cm51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuZmI9IiI7dGhpcy5ZZT0hMTt0aGlzLk4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSx0czpmdW5jdGlvbihiKXt0aGlzLko9Yn0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxuczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LEl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LAppc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxZdTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcCgpfHx0aGlzLmptKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEx1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGptOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPwohMDohMX0sTzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxDYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxoYjpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmZiPQpifSxIdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZifSxXcjpmdW5jdGlvbigpe3RoaXMuZmI9bnVsbH0sTnU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmZiJiYoYj0hMCk7cmV0dXJuIGJ9LFR1OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxFdTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5xa3x8cDsoZnVuY3Rpb24oYyl7Yy5NZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLlZsPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuS2U9dGhpcy5CZz0hMTt0aGlzLnN0YXR1cz10aGlzLmljO3RoaXMuaWQ9Zi5wYSgxMCk7dGhpcy5ZYyhiKTt0aGlzLmxzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLnFzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy50YiYmMDx0aGlzLnRiLmxlbmd0aCYmKHRoaXMudGI9Zi51bmlxdWUodGhpcy50YiksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sTXU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LHFzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuRWV9LHJzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5WbH0sQ2I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGxzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxscDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEpxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5NZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hbz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLlNnPWI7Yi5wcm90b3R5cGU9CntGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlNnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Gbyg0KTsoZnVuY3Rpb24oYyl7Yy5yaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LApwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLnJofHxSOyhmdW5jdGlvbihjKXtjLnFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuR3Q9MUUzO3RoaXMuV2Y9bnVsbDt0aGlzLml0PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy4kbSliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLllvLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5CcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLkFwKGEsCmIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuSnQoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLkt0KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuenAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sT246ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxKdDpmdW5jdGlvbihiKXt0aGlzLmdkfHwodGhpcy5nZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTHQoYil9LmJpbmQodGhpcyksdGhpcy5HdCkpfSxMdDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCk7dGhpcy53KCl9LEt0OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdkKX0sCnpwOmZ1bmN0aW9uKGIpe3RoaXMuenUoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuRHI8dGhpcy5pdD90aGlzLncoKTp0aGlzLm0oKX0sQnA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxZbzpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXt0aGlzLkRyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMucWh8fGxhOyhmdW5jdGlvbihjKXtjLnNoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGYuRGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgUihiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBsYShnLAp0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5zaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs3XTt0aGlzLkptPXRoaXMuYVs0XTt0aGlzLnJtPXRoaXMuYVs4XTt0aGlzLlVtPXRoaXMuYVs4XTt0aGlzLlNzPXRoaXMuYVsxXTt0aGlzLkRuPXRoaXMuYVs0XTt0aGlzLll0PXRoaXMuYVs1XTt0aGlzLnJsPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuSW49YjtiLnByb3RvdHlwZT17Ums6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNrOnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KbTp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm06dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMuUnMoYSl9LApSczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3M6dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRuOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5Jbnx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMuUmsoNCk7KGZ1bmN0aW9uKGMpe2MuWmk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT0KYi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSx0aGlzLmVxPSEwKTt0aGlzLlIoYSk7dGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmVxKXt0aGlzLmNxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksCjUwKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT0KYi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxoYjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7CnZhciBwYT1jLlppfHxwYTsoZnVuY3Rpb24oYyl7Yy5ZaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5hYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYWI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJgoodGhpcy5DYigpLHRoaXMuZ2V0UGxheWVyKCkuUG49ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmZiO2EmJihhLlRkKCksYS5BYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTsKaWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlBmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToKKHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm1jLmxlbmd0aD49dGhpcy5wZCYmdGhpcy5vKCkpfSxKcTpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtmLklzKGEudmlkZW9UYWcpJiYoYS5jcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLllpfHxxYTsoZnVuY3Rpb24oYyl7Yy4kaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmlwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYKIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHBhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5JKGcpfHx0aGlzLmZxKGcpfHwodGhpcy5MKGcpLGc9bmV3IHFhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGlwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy4kaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1rPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs5XTt0aGlzLlNwPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy5IcD1iO2IucHJvdG90eXBlPQp7bGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56aTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB0YT1jLkhwfHx0YSxPYz1uZXcgdGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1PYy5sayg0KTsoZnVuY3Rpb24oYyl7Yy5HbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLk8oYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlIoYik6dGhpcy5IKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTt2YXIgdWE9Yy5HbHx8dWE7KGZ1bmN0aW9uKGMpe2MuRmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHZhPWMuRmx8fHZhOyhmdW5jdGlvbihjKXtjLkhsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYwPGYuRGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9Cm5ldyB1YShnKSx0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyB2YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19KX0pKGMpO3ZhciB3YT1jLkhsfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGc9dGhpcy5hWzldO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzVdO3RoaXMudXQ9dGhpcy5hWzNdO3RoaXMuT2g9dGhpcy5hWzRdO3RoaXMuc289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5IbT1iO2IucHJvdG90eXBlPXtPZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUGc6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kcTp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnV0OnRoaXMuTmgoYSl9LE5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PaDp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB5YT1jLkhtfHx5YSxQYz1uZXcgeWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5PZyg0KTsoZnVuY3Rpb24oYyl7Yy51bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5PKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmI/dGhpcy5SKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5KJiZ0aGlzLkooKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/CmIuYXV0b3BsYXkoKTohMX0samI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLnVsfHx6YTsoZnVuY3Rpb24oYyl7Yy50bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMudW4oKTsKdGhpcy5IYSgpfSxVdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFZiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj0KdGhpcy5TYSgpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLlhiPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlhifSxhcTpmdW5jdGlvbigpe2lmKCF0aGlzLnhmKXt2YXIgYj10aGlzLlNhKCksYT10aGlzLlpwKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LFpwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuV2EoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5XKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sRnU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSx1bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8CmIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFxKCkpe3ZhciBhPXRoaXMuU2EoKSxnPXRoaXMuVmIoKTthJiZnJiYodGhpcy5TYSgpLHRoaXMuVmIoKSx0aGlzLnRkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGQ/dGhpcy5tKCk6KHRoaXMuVyghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuU2EoKX1lbHNlIHRoaXMueWY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fAp0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2bjpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/Cih0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLnpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLnpnLGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxBbjpmdW5jdGlvbigpe3RoaXMuUHV8fCgxMDx0aGlzLkh0Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5IdCsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLlZyKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTApKSl9LFZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5JdCl7dGhpcy5JdD0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQWE9Yy50bHx8QWE7KGZ1bmN0aW9uKGMpe2Mudmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPApmLkRhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IHphKGJbZ10pLGEuamF8fHRoaXMuSShhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgQWEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSDpmdW5jdGlvbigpe3RoaXMucWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5hYyl9fSl9KShjKTt2YXIgQmE9Yy52bHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZpPXRoaXMuYVszXTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLnN0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuZ3I9YjtiLnByb3RvdHlwZT17dWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZpOnRoaXMuSnIoYSl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuS3I6dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5ncnx8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMudWkoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5PKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGhiOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMuWGt8fEVhOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoITApOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy53KCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5tKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWMuYmluZCh0aGlzKSwxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksCnRoaXMubSgpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLnpiJiYodGhpcy56Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWN8fCh0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpOwpiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuZWM9ITAsdGhpcy5tKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMuV2t8fEZhOyhmdW5jdGlvbihjKXtjLllrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmCnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgRWEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEZhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBHYT1jLllrfHxHYSxIYT1uZXcgR2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzRdO3RoaXMudms9dGhpcy5hWzJdO3RoaXMuaHU9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzldO3RoaXMudHI9dGhpcy5hWzNdO3RoaXMucHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbM119Yy5mbz1iO2IucHJvdG90eXBlPXtVbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVm86dGhpcy51ayhhKX0sdWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZrOgp0aGlzLmd1KGEpfSxndTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaHU6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhqOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy50cjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5mb3x8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuVW8oNCk7KGZ1bmN0aW9uKGMpe2MuYmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlOwp0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy5iaHx8SmE7KGZ1bmN0aW9uKGMpe2MuYWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTsKYi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMuYWh8fEthOyhmdW5jdGlvbihjKXtjLmRoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLApkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBKYShkLGEpLHRoaXMuSShkKXx8KGQuTGQoYSksdGhpcy5MKGQpLGQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy5kaHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVsyXX1jLmpqPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54bzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIE5hPWMuamp8fE5hLFNjPW5ldyBOYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53byg0KTsoZnVuY3Rpb24oYyl7Yy51aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5PKGIpO3RoaXMuUihiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJgowPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBPYT1jLnVqfHxPYTsoZnVuY3Rpb24oYyl7Yy50aj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5XYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5sYygpfSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD8KYi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFBhPWMudGp8fFBhOyhmdW5jdGlvbihjKXtjLnZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgT2EoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBQYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgUWE9Yy52anx8UWEsUmE9bmV3IFFhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzRdfQpjLmFuPWI7Yi5wcm90b3R5cGU9e2tuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIFNhPWMuYW58fFNhLFRjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLmtuKDQpOyhmdW5jdGlvbihjKXtjLmJrPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuVWQ9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmRhKCk7cmV0dXJufXRoaXMuTyhhKTsKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUihiKTp0aGlzLmRhKCl9LEVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmIsZz10aGlzLmViKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLlRkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5VZD0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LGpiOmZ1bmN0aW9uKCl7dGhpcy5VZCsrOwppZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sSzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZWE6ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9fSl9KShjKTsKdmFyIFRhPWMuYmt8fFRhOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5nYnx8KHRoaXMuZ2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5nYisrLDE1PHRoaXMuZ2IpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuVmEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMuV28/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsCmZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLldvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5FcihhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgVWE9Yy5ha3x8VWE7KGZ1bmN0aW9uKGMpe2MuY2s9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IFVhKGEsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBWYT1jLmNrfHxWYSxXYT1uZXcgVmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGw9dGhpcy5hWzddO3RoaXMuTG09dGhpcy5hWzVdO3RoaXMuV2g9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsyXTt0aGlzLmpyPXRoaXMuYVsxMF07dGhpcy5SaT10aGlzLmFbOF07dGhpcy5wbD10aGlzLmFbN107dGhpcy54aj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsxMF19Yy5kcz1iO2IucHJvdG90eXBlPXtTbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlRsOnRoaXMuS20oYSl9LEttOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG06dGhpcy5WaChhKX0sVmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldoOnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lbzp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuanI6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJpOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbDp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBYYT1jLmRzfHxYYSxVYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0KVWMuU2woNCk7KGZ1bmN0aW9uKGMpe2MuaWk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLk8oYi5lbGVtZW50KTt0aGlzLlIoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgWWE9Yy5paXx8WWE7KGZ1bmN0aW9uKGMpe2MuaGk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBaYT1jLmhpfHxaYTsoZnVuY3Rpb24oYyl7Yy5qaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgWWEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFphKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgJGE9Yy5qaXx8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsyXTt0aGlzLlhpPQp0aGlzLmFbMTBdO3RoaXMuV3A9dGhpcy5hWzEwXTt0aGlzLmNpPXRoaXMuYVsxXTt0aGlzLkR0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuaHI9YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pazp0aGlzLldpKGEpfSxXaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGk6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2k6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgYmI9Yy5ocnx8YmIsVmM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuaGsoNCk7CihmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0saGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sem46ZnVuY3Rpb24oKXtmLkRmKHRoaXMuRGMpO2YuRWYodGhpcy5EYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpuKCl9LmJpbmQodGhpcyksNTApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgY2I9Yy5UaXx8Y2I7KGZ1bmN0aW9uKGMpe2MuU2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGRiPWMuU2l8fGRiOyhmdW5jdGlvbihjKXtjLlVpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiYKay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBlYj1jLlVpfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQnI9dGhpcy5hWzFdO3RoaXMuem89dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzJdO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuUWs9dGhpcy5hWzldO3RoaXMuJHQ9dGhpcy5hWzJdO3RoaXMuZmg9dGhpcy5hWzVdO3RoaXMuTGk9dGhpcy5hWzEwXTt0aGlzLnltPQp0aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLndtPWI7Yi5wcm90b3R5cGU9e0FyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ccjp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem86dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZyOnRoaXMucG8oYSl9LHBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xbzp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFrOnRoaXMuWnQoYSl9LFp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJHQ6dGhpcy5laChhKX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZoOnRoaXMuS2koYSl9LEtpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaTp0aGlzLnhtKGEpfSx4bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueW06dGhpcy5EbChhKX0sRGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRWw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy53bXx8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuQXIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnBpPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sa206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5waXx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwyMDAhPWYuc3RhdHVzJiYyMDEhPWYuc3RhdHVzfHxnKGYpO2lmKGQmJjQ9PWYucmVhZHlTdGF0ZSYmMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1cylkKGYpO2Vsc2UgaWYoND09Zi5yZWFkeVN0YXRlJiYwPT1mLnN0YXR1cyYmbSYmbS5GZCh0aGlzLklhLnVybCkmJm0uZGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLm1zKCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMucmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZGYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLm5nP3RoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMSk6dGhpcy5OYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCEwKSx0aGlzLktnfHwodGhpcy5OYS53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiZtLkZkKHRoaXMuSWEudXJsKT9tLmRkP20uZ2EoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uRmQodGhpcy5JYS51cmwpLHRoaXMuVGYmJnRoaXMuVGYoKX1yZXR1cm4gdGhpcy5OYX19fSkoYyk7dmFyIGhiPWMucml8fGhiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLk9iPSIiO3RoaXMudWQ9dGhpcy5iYj1udWxsO3RoaXMuYW89dGhpcy5uYj10aGlzLkxmPSExO3RoaXMudWE9IiI7dGhpcy5HZj0hMTt0aGlzLnphPXRoaXMuSmM9IiI7dGhpcy5DZj10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5oYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSGI9IiI7dGhpcy5vYj1bXTt0aGlzLkliPVtdO3RoaXMuR2I9IiI7dGhpcy5sZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNkPSExO3RoaXMuQm49dGhpcy5lZD1udWxsO3RoaXMuZmM9dGhpcy5BZz10aGlzLm5lPXRoaXMuZGQ9dGhpcy52ZD10aGlzLmpjPSExO3RoaXMuUGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fQpjLnNpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLmFvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuR2YsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMuemEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5ZLGlzQmxvY2tlZDp0aGlzLkNmLHNlcnZlcjp0aGlzLk1hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMudGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy55ZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5rZSxIT01BRF9WRVJJRklFRDp0aGlzLnllLEhPTUFEX0JMT0NLRUQ6dGhpcy53ZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5zYiwKSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkJuLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuamMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnZkLHVzZVN0cmljdENoZWNrczp0aGlzLmRkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUGEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMuZmcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuZmN9fSxEcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYKMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxqcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1mLlptKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5PYnx8dGhpcy5iYnx8dGhpcy51ZCkmJihrPXRoaXMuUXEoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5rcChmLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LApPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxaYjpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5NYSYmdGhpcy5NYS5sZW5ndGgmJjA8dGhpcy5NYS5sZW5ndGgmJihiPXRoaXMuTWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGtwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnh1O3JldHVybiJub25lIn0sTGM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYVt0aGlzLmZnXX0sYWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLmpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LFFxOmZ1bmN0aW9uKGEpe3RoaXMuT2ImJgooYSs9dGhpcy5PYik7aWYodGhpcy5iYilmb3IodmFyIGIgaW4gdGhpcy5iYil0aGlzLmJiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmJiW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj1oO3RoaXMuRXEoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuemEpdGhpcy5DcSgpO2Vsc2UgdHJ5e3RoaXMuemE9YigpLHRoaXMud2MoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEVxOmZ1bmN0aW9uKCl7dGhpcy5GYShuZXcgeih0aGlzLkpjK3RoaXMub2MoImdsb2JhbCIpKSwKdGhpcy55cC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxDcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnZkKXt0aGlzLnZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwppZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMud2UpKTt0aGlzLnJiKCk7Zi5UYihsLnVyKTsoYj1mLm9mKHRoaXMuTGMoKSkpfHwoYj1mLm9mKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx5cDpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDsKdGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuemF9ZWxzZSBhPXRoaXMuemE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5NYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMudGY9YS5hZHBhdGh8fCIiO3RoaXMueWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5mZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5NYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiYKdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5hZSgpKSxjPXRoaXMuS2EodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMub2MoImN1c3RvbWVyIikpO3RoaXMuRmEoYix0aGlzLk1zLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNlKCJjdXN0b21lciIpO2E/dGhpcy5Haz90aGlzLmdhKCJub1NWTUNvbmZpZyIpOgoodGhpcy5Haz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LE1zOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLm5lPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuQWc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLm9iPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5zcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMueWQmJih0aGlzLkdiPW51bGwpO3RoaXMubGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5DZCYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuQ2Q9ITAsdGhpcy5RYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5mdCgpJiYodGhpcy5IYnx8dGhpcy5JYnx8dGhpcy5vYnx8dGhpcy5HYik/dGhpcy5aZD8odGhpcy5vYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuc2IpKSwKdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5WcygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLldzKCkpfX0sVnM6ZnVuY3Rpb24oKXt0aGlzLlVzKCl9LFdzOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYShhKSksdGhpcy5yYigpLHRoaXMud2QoKSl9LFVzOmZ1bmN0aW9uKCl7aWYodGhpcy5IYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5xZygpfWVsc2UgdGhpcy5xZygpfSxwZzpmdW5jdGlvbigpe3ZhciBlO3ZhciBjO2Z1bmN0aW9uIGEoKXtlPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlpzKGUsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5pZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuY2QodGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfXRoaXMub2I9bnVsbCx0aGlzLmllKCl9LFpzOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7ZigpJiYKYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy4kcyhlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuSWImJnRoaXMuSWIubGVuZ3RoKXt2YXIgYz10aGlzLkliLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGcoKX0sJHM6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoKXtoKCkmJmIoKX1mdW5jdGlvbiBmKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7bC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtsLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2wub25sb2FkPWU7bC5vbmVycm9yPWY7bC5zcmM9YTtsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChtKXtlKCl9fSxpZTpmdW5jdGlvbigpe3RoaXMuR2I/KHRoaXMua2UrKyx0aGlzLkZhKG5ldyB6KHRoaXMuR2IpLHRoaXMuVHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuamUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5vZygpfSxqZTpmdW5jdGlvbihhKXt0aGlzLmNkKHRoaXMueGUsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVHM6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLm9nKCk6dGhpcy5qZSgiQUFBIil9LG9nOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpO3RoaXMud2QoKX0scmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7Zi5XYSgpJiYoYT0iMSIpO3RoaXMuamMmJihiPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnllKSk7dGhpcy5lZCYmImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSx5bjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuRHAoKSl7dmFyIGE9dGhpcy5qcCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxGYTpmdW5jdGlvbihhLGIsYyxlLGgsSWMpe2E9bmV3IGhiKGEsYixjKTtlJiYoYS5LZz0hMCk7aCYmZi5ncSgpJiYoYS5kZj0hMCk7SWMmJihhLm5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LE9lOmZ1bmN0aW9uKCl7Zi5XYSgpfHxmLlhhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSwKZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtlPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuWmIoKXx8KGE9dGhpcy5LYShlKSxlPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PQpoLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx4bjpmdW5jdGlvbigpe3RoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiOwphLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy55dC5iaW5kKHRoaXMpLHRoaXMueHQuYmluZCh0aGlzKSl9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXtyZXR1cm59Y3x8dGhpcy5MbygpfSx4dDpmdW5jdGlvbigpe30sTG86ZnVuY3Rpb24oKXtmLlRiKGwuS28pO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHdkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMubmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5uYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLm5iW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZmLlhhKGIudXJsLApiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LGZ0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZSxmLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLAplPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGU9MTQ7ZS0tOyljW2JbZV1dPWFbZV18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxmLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGUpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTIwOzM5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT00MDs1OT49ZTtlKyspeD1jKGYsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXg9YyhmLDUpKyhuXnBedykrdCtoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsCmY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuc2l8fGliLG09bmV3IGliO3dpbmRvdy5DdT1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLnlxPXRoaXMuYVsxXTt0aGlzLnJxPXRoaXMuYVs4XTt0aGlzLmtvPXRoaXMuYVs0XTt0aGlzLlV0PXRoaXMuYVs1XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnF0PXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVsxMF07dGhpcy5HbT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs4XX1jLk1wPWI7Yi5wcm90b3R5cGU9e1ZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Xbjp0aGlzLnhxKGEpfSwKeHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlxOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ycTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua286dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlV0OnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5kbDp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXQ6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxwOnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBqYj1jLk1wfHxqYixYYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuVm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5YbT0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5wbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTsKdGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMuanQ9dGhpcy4kYT0hMX1jLmxpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiZ0aGlzLmNvbmZbdGhpcy5MYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLkxhXVthXSk7cmV0dXJuIGJ9LHVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkVhJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLAoiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLmRtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLiRhPWM7aWYodGhpcy5ULlkpdGhpcy5ULnluKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDohMH0pKTp0aGlzLkFhKCk7ZWxzZXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLkpkKGEsYixjKX0sNTApfX0sVmQ6ZnVuY3Rpb24oYSl7dGhpcy5FYz0KITE7dGhpcy5zPWE7dGhpcy51cyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMudXAoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sdXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8ZS5sZW5ndGg7aysrKWVba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLAplW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlP2YuRChsLlJ0LHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk6KGYuS2QoKSxiPT1DLkJlLmNvZGUmJmYuRChsLlVxLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpO2YuRChsLkpvLHRoaXMucy5QLHRoaXMuai51LkIoKSwKdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC56dCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5hdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuZHUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuVnEsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSxmLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGYudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsCiIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sdXM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuVnU9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249CnRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5wbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMubG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLm5tKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5NbigpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnNzKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sc3M6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmZi5vbSh0aGlzLnMub3JpZ2luLnRlKTtmLlphKCJzZXRVcFZwYWlkIik7dmFyIGI9dGhpcy5qLkM7dGhpcy5qLkM9Qi5wb3AoKTtiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuai5DLApiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5qLkcuYXBwZW5kQ2hpbGQodGhpcy5YKTt0aGlzLlgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zLndwKCksYz1hKHRoaXMucy5QLk9yaWdpbmFsQWRQYXJhbWV0ZXJzKSwKZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7Yj1mLnFuKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTXQoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnQoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF0KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB0KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk90KCkpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcykpOwpmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LE50OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LE10OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuWmEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuWmEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuWmEoImZpcnN0UXVhcnRpbGUiKX0sUXQ6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi5aYSgidGhpcmRRdWFydGlsZSIpfSxQdDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5aYSgiY29tcGxldGUiKX0sT3Q6ZnVuY3Rpb24oKXtmLlphKCJhZHN0b3BwZWQiKTt0aGlzLkFhKCl9LGxtOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7dmFyIGU9YixmPXRoaXMuVDsKZi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLkZ0LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxubTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LFhjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IiwKdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG0pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuV2EoKSYmdGhpcy5ULkFnJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5zLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5BYnx8KHRoaXMuQWI9ITAsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLlQuZ2EoInZpZGVvLW5vb3AiKSk7CnJldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLkV0KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9dGhpcy5qLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuS2MucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCmZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5CYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmhlKCkpfS5iaW5kKHRoaXMpOwp0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5abCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LEZ0OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5FZCgpPwp0aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuanQpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm10KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5nZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5rZyk7YyYmKGI9dGhpcy5zLmdlLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwuZW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5wYy5yZXBsYWNlKCJbdGltZV0iLGYuZWYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5wcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5jYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLnduLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0scHA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLlpiKCkmJihmPWguS2EoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7ZS51cmw9ZjthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKd246ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtdDpmdW5jdGlvbihhKXthPT10aGlzLndnfHx0aGlzLkFifHwoMD09YSYmKHRoaXMuJGEmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuJGEpLHRoaXMuJGE9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuV2EoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGYuRChsLmFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi5EKGwuZm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSx0aGlzLlJiJiZmLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLiRsLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC5jbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5EKGwuaG0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSksZi5EKGwuaW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSwKdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnZwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmJxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YuRChsLmJtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSx7YWRJZDp0aGlzLmJkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5JZChlLnVybCxlLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy55YT10aGlzLlhuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5rbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0sdnA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxYbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxFdDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSxFZzpmdW5jdGlvbigpe2YuRChsLkxuLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkVjJiZmLldhKCkmJmYudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZi5lcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMua3QuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5XYi5iaW5kKHRoaXMpKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9lLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtlLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5nZSYmYS5hcHBlbmRDaGlsZChlKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LmhiJiZ0aGlzLmoudS5oYigpJiZ0aGlzLlJxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxsdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEJiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5jYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhkKCl9ZWxzZSB0aGlzLnhkKCl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMDt0aGlzLmouc2YoKTsKdGhpcy5qLlpyKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5XcigpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGYuRWYodGhpcy52aWRlbyxhKT90aGlzLllyKCk6dGhpcy5UZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmxpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVs4XTt0aGlzLmdpPXRoaXMuYVsyXTt0aGlzLkJvPXRoaXMuYVsxMF07dGhpcy5KbD10aGlzLmFbN107dGhpcy5Iaj10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLlFtPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/CnRoaXMuRG86dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk9yOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5naTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQm86dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iajp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy5RbXx8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuYWE9bnVsbDt0aGlzLk1iPSExO3RoaXMudGU9IiI7dGhpcy5zZT0hMTtkJiZkLmVtcHR5P3RoaXMuSXEoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5zbD1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5XZSgpLGI7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS5UYShtLktzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSHEuYmluZCh0aGlzKSx0aGlzLkRxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkVhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5FYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuRWEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwKMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxIcTpmdW5jdGlvbihhKXt0aGlzLlByKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSXE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQmEoeC5rZCkpfXRoaXMuYmE9dGhpcy5mZigpO3RoaXMuTWI9dGhpcy5yZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuUmMoKTp0aGlzLmZhKHRoaXMuQmEoeC5nYyx7ZXJyb3I6dGhpcy5zZT9DLmpkOkMuQWV9KSl9LERxOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkJhKHguemUse2RlcHRoOmF9KSl9LFJjOmZ1bmN0aW9uKCl7dGhpcy5hYT10aGlzLmJhLnNoaWZ0KCk7dGhpcy5pcSgpP3RoaXMuYXQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy52dCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSx2dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLllzKCk/dGhpcy5YcygpPyEwOigtMSE9dGhpcy5VYigpPwp0aGlzLmZhKHRoaXMuQmEoeC52ZSkpOnRoaXMuZmEodGhpcy5CYSh4Lm5oKSksITEpOih0aGlzLmZhKHRoaXMuQmEoeC5nYyxDLkJlKSksITEpfSxWZDpmdW5jdGlvbihhKXthLnlhPWEueWEuY29uY2F0KHRoaXMuTWQoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy5NYjt0aGlzLnBhcmVudC5WZChhKX0sU246ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbGI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMubGYoKTthLnZjPXRoaXMuZnAoKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLmJwKCk7YS5nZT10aGlzLnRwKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLmhwKCkpOmIueWEuY29uY2F0KHRoaXMubnAoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksCmE9MCx0aGlzLlJjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYSYmdGhpcy5wYXJlbnQuZmEoYiksYT0wKX0seGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQueGIoYSl9LCRlOmZ1bmN0aW9uKGEsYil7dGhpcy5mYSh0aGlzLkJhKGEsYikpfSxCYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBtYihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGF0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sWXM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxYczpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sUHI6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuc2U9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnFmKCkubGVuZ3RofSxxZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFwKHRoaXMuYWEsIlZBU1RBZFRhZ1VSSSIpfSxNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sCm5wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LGhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxmcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnliKHRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApBdTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy55YihhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LGJwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0KIiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMucmYoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2YucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sdHA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5GcyhnLGEpLDA+CmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxxcDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMueWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHhwOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx5YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJmKGEpOiIifSxyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnhwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5zbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gbj10aGlzLmFbMV07CnRoaXMuZnM9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzhdO3RoaXMuUWo9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy53aD1iO2IucHJvdG90eXBlPXtFbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRm46dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZzOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qbzp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBuYj1jLndofHxuYixaYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT0KW107dGhpcy52Yz0iIjt0aGlzLlA9dGhpcy52Yj0hMTt0aGlzLm9yaWdpbj1udWxsfWMubms9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sd3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBsYj1jLm5rfHxsYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scj10aGlzLmFbNl07dGhpcy5ZaD10aGlzLmFbMTBdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOV19Yy5IaD1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlloOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56cjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIG9iPWMuSGh8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5rcig0KTt2YXIgeD17a2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LG5oOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxnYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxDZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHplOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0saGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnB1Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSx2ZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17QWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sQmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0scnU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubnI9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbM119Yy5hcj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5yOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMuYXJ8fHBiLGFkPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLm1yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5LaD1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMuS2h8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naz10aGlzLmFbOF07dGhpcy5MbD10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbMTBdO3RoaXMuZW49dGhpcy5hWzldO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbMl19Yy5Maz1iO2IucHJvdG90eXBlPXtmazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2s6dGhpcy5LbChhKX0sS2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkpwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5Ma3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PWJkLmZrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMudGg9YjtiLnByb3RvdHlwZT17Z2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLiRwKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PQp3aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2UmJihoLnBvc2l0aW9uPWUpO3JldHVybiBofSxMczpmdW5jdGlvbigpe3RoaXMuSWY9ITB9LHlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sVmY6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtmLkQobC55Yyx0aGlzLnUuQigpKX0sWnI6ZnVuY3Rpb24oKXt0aGlzLklmfHwodGhpcy51LnBsYXkoKSxmLkQobC56Yyx0aGlzLnUuQigpKSl9LGNjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKwoicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlFhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUWEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUWEpO3RoaXMudS5EYiYmdGhpcy51LkRiKCk/dGhpcy51LmdmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy51Zi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sJHA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGdwOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LHVmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5RYSk7aWYoYi54IT10aGlzLlJhLnh8fGIueSE9dGhpcy5SYS55fHxiLnBvc2l0aW9uIT10aGlzLlJhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlJhLndpZHRofHxiLmhlaWdodCE9dGhpcy5SYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5SYS53aWR0aCYmMDx0aGlzLlJhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuc2YoKTtyZXR1cm59dGhpcy5SYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLnZmLmxlbmd0aDthKyspdGhpcy52ZlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxzZjpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkcpO3RoaXMuQyYmdGhpcy5DLnBhdXNlJiZ0aGlzLkMucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBOPWMudGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0KImJsb2NrIjtMLmlkPWYucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLFk9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vbz10aGlzLmFbOF07dGhpcy4kZz10aGlzLmFbMTBdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuQW09dGhpcy5hWzEwXTt0aGlzLkVtPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzhdfWMuZXQ9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9vOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kZzp0aGlzLnZzKGEpfSwKdnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLndzOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQW06dGhpcy5EbShhKX0sRG06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgc2I9Yy5ldHx8c2IsY2Q9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2Qubm8oNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpOwp0aGlzLk8oYSk7dGhpcy5mZShiKTt0aGlzLlhlKCl9LGZlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQ2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlIoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQ2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB0Yj1jLlVqfHx0YjsoZnVuY3Rpb24oYyl7Yy5Uaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9WigpO3RoaXMudWI9dGhpcy51Ynx8ITE7dGhpcy5HZT10aGlzLkplPXRoaXMuemY9dGhpcy5pYT10aGlzLm1lPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLApiKXt0aGlzLlhvKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5tZT0hMDt0aGlzLnpmJiZ0aGlzLlJlKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZmI7YSYmYS5ZYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy56Zj0hMDt0aGlzLlJlKCl9LmJpbmQodGhpcykpO3RoaXMuTmUoKX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy51Yil7dGhpcy50YygpO2lmKCF0aGlzLm1lJiYhdGhpcy50YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwKMTAwKSwhMDt0aGlzLm1lJiZ0aGlzLkdlJiYhdGhpcy5KZSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19LHRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxtZjpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxOZTpmdW5jdGlvbigpe2lmKHRoaXMudGMoKSl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkplPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuR2U9Yi53dX10aGlzLmhhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmUoKX0uYmluZCh0aGlzKSwxMDApfSxEdTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5RdSgpOiExfSxVYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuVWIoKTotMX0sb3A6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sWG86ZnVuY3Rpb24oYixhKXt0aGlzLnViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMudWJ8fDMwMj09dGhpcy51Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy51Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX0seGM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPyh0aGlzLm0oKSx0aGlzLm5hKCkpOmIuTmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciB1Yj1jLlRqfHx1YjsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGhxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLnJrLldsLlVsP3dpbmRvdy5PTy5yay5XbC5VbC51dShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ocSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPVooKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxmLkRhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB0YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgdWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIHZiPWMuVmp8fHZiLHdiPW5ldyB2YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcT10aGlzLmFbOF07dGhpcy5Ibj10aGlzLmFbNV07dGhpcy5DbT10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs3XX1jLlZpPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLkduKGEpfSwKR246ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5DbTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3U6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy5WaXx8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuTHEoNCk7KGZ1bmN0aW9uKGMpe2MuVWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5Va3x8eWI7KGZ1bmN0aW9uKGMpe2MuVGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp5LnFkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuYnIoYSl9LmJpbmQodGhpcykpO3kuQ3AoKX0sYnI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7CnRoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgemI9Yy5Ua3x8emI7KGZ1bmN0aW9uKGMpe2MuVms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuJG4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9CltdKTt0aGlzLlNjLnB1c2goYlthXSk7dmFyIGU9bmV3IHliKGQpO3RoaXMuSShlKXx8KHRoaXMuTChlKSwobmV3IHpiKGUsdGhpcy5BKSkuYigpKX1jYXRjaChoKXt9fX10aGlzLkgoKX0scWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuWnx8KHRoaXMuWj17fSk7dGhpcy5aW2JdfHwodGhpcy5aW2JdPXt9KTt0aGlzLlpbYl1bYV18fCh0aGlzLlpbYl1bYV09W10pO3RoaXMuWltiXVthXS5wdXNoKGMpfSxidDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMuWHIoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSwKQ3A6ZnVuY3Rpb24oKXtpZih0aGlzLiRiKWZvcih2YXIgYj0wO2I8dGhpcy4kYi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLiRiW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5aW2NdW2RdJiYwPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ0KGIpfX0pfSkoYyk7dmFyIEFiPWMuVmt8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaj0KdGhpcy5hWzNdO3RoaXMub3U9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5taD1iO2IucHJvdG90eXBlPXtFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm91OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgQmI9Yy5taHx8QmIsZWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRWooNCk7KGZ1bmN0aW9uKGMpe2MuZ2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0samI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLmdofHxDYjsoZnVuY3Rpb24oYyl7Yy5oaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkNyfHwodGhpcy5Dcj0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5oaHx8RGI7KGZ1bmN0aW9uKGMpe2MuaWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgQ2IoZCk7dGhpcy5JKGYpfHwodGhpcy5MKGYpLChuZXcgRGIoZix0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5IKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5paHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maj10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbMTBdO3RoaXMuYmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbM119Yy5Fbz1iO2IucHJvdG90eXBlPXtLajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTGo6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlpuOnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaDp0aGlzLmFqKGEpfSxhajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYj1jLkVvfHxHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC5Laig0KTsKKGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLnlsfHxIYjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy5ab3x8KHRoaXMuQWYoKSx0aGlzLlpvPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLkxlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5MZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLAo1MDApKX0sY3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jcCgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5vKCksdGhpcy5sKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZigpfS5iaW5kKHRoaXMpLDUwKX0sT3U6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBJYj1jLnhsfHxJYjsoZnVuY3Rpb24oYyl7Yy56bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5MKGMpLChuZXcgSWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEpiPWMuemx8fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy5RcD10aGlzLmFbN107dGhpcy5SbD10aGlzLmFbN107dGhpcy5VcD10aGlzLmFbMTBdOwp0aGlzLiRrPXRoaXMuYVs1XTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuVmc9YjtiLnByb3RvdHlwZT17Um06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNtOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcDp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmw6dGhpcy5UcChhKX0sVHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlVwOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kazp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLlZnfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9Z2QuUm0oNCk7KGZ1bmN0aW9uKGMpe2MuaGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYoMCx0aGlzLkopKCEwKX0uYmluZCh0aGlzKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTsKdmFyIE1iPWMuaGp8fE1iOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZ20oKX0uYmluZCh0aGlzKSksdGhpcy5KZz0hMSx0aGlzLlN0PQoxRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLlN0KSl9LGdtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTsKYltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy5nanx8TmI7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8CndpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpO3ZhciBPYj1jLmlqfHxPYixQYj1uZXcgT2IocSk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs5XTt0aGlzLmxxPXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVsxMF07dGhpcy5KaD10aGlzLmFbN107dGhpcy5PcD10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52aDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy54aChhKX0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnloOnRoaXMuSWgoYSl9LEloOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLlNxfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTmt8fFJiOyhmdW5jdGlvbihjKXtjLk1rPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLkdkKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLAoxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLk1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5Paz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmCiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIFRiPWMuT2t8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbMTBdO3RoaXMuSmk9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy4kcj1iO2IucHJvdG90eXBlPXtFaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmk6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkppOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5QbTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOgphfX19KShjKTt2YXIgVmI9Yy4kcnx8VmIsaWQ9bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aWQuRWkoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuV2Q9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkZyKCl9LmJpbmQodGhpcyksNTAwKX0sRnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJgpiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2QmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuV2QpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwKInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sSHM6ZnVuY3Rpb24oKXt0aGlzLldkPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgV2I9Yy5Fa3x8V2I7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLktiPTB9LGI6ZnVuY3Rpb24oKXt0aGlzLk5xPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMuS2J8fHRoaXMuS2IrKyx0aGlzLktiPD10aGlzLk5xPyh0aGlzLktiKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IcygpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgWGI9Yy5Ea3x8WGI7KGZ1bmN0aW9uKGMpe2MuRms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IFdiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFhiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgWWI9Yy5Ga3x8WWIsWmI9bmV3IFliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLkRpPXRoaXMuYVs5XTt0aGlzLlFzPXRoaXMuYVsxMF07dGhpcy4kaj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkJoPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nbjp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVGg6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOgp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgJGI9Yy5CaHx8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuZm4oNCk7KGZ1bmN0aW9uKGMpe2Muems9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5PKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlIoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLkooKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy56a3x8YWM7KGZ1bmN0aW9uKGMpe2MueWs9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkNhKCk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkljKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5CcSgpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxObjpmdW5jdGlvbigpe3RoaXMuRmUoKXx8dGhpcy5vKCEwKX0sQnE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5JYygpOyFiLm1hJiZiLmJhJiZiLnR1JiZiLnZ1JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkNhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10uaWQ9PQphKXJldHVybiBiW2NdO3JldHVybnt9fSxHZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxvOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5JYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLnlrfHxiYzsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSlmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IGJjKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBjYz1jLkFrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzFdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMud3E9dGhpcy5hWzldO3RoaXMubGg9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ibz1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR2g6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNrOnRoaXMuQ2goYSl9LENoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EaDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3E6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMuYm98fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWtkLkZoKDQpOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuTyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5SKGEpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sSzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQ2E6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmCih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVD1jLnJqfHxUOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlhkPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGQ9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5YZCYmYiE9dGhpcy5YZHx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKGsuYWRUYWc9YS5hZFVSTCksdGhpcy5sKCJhZGVycm9yIixhLlN1KSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVPWMucWp8fFU7KGZ1bmN0aW9uKGMpe2Muc2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEQpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgVChiKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgVShiLHRoaXMuQSksYi5iKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFQoYiksYi5qYT90aGlzLmNnKCk6dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBELGZjPWMuc2p8fGZjLGdjPW5ldyBmYyhmdW5jdGlvbihjLGIpe2MucGF1c2UoKTtpZihtLm5iLmxlbmd0aCl7dmFyIGE9bS5uYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9Zi5wcyh7IltMT0FEU0NSSVBUXSI6Zi5wYSgxMCksIltVVElMU10iOmYucGEoMTApLCJbQ0FMTEJBQ0tdIjpmLnBhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09Zi5NZi5iaW5kKGYpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKWtbZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWYuTWYoZywKZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obz10aGlzLmFbNV07dGhpcy5Fcz10aGlzLmFbOV07dGhpcy5tbz10aGlzLmFbMV07dGhpcy56aj10aGlzLmFbM107dGhpcy5pbz10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbOF07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbM107dGhpcy5maj10aGlzLmFbMl07dGhpcy5nPXRoaXMuYVsyXX1jLnRpPWI7Yi5wcm90b3R5cGU9e01vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Obzp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRXM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5tbzp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Jazp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBsOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhjPWMudGl8fGhjLGxkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLk1vKDQpOyhmdW5jdGlvbihjKXtjLmdsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuTyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlIoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlRxPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxnczpmdW5jdGlvbihiKXt0aGlzLm5kPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UcX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sSzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJih0aGlzLkomJnRoaXMuSigpLHRoaXMubmQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm5kJiYobmV3IEcodGhpcyx0aGlzLm5kKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuZ2x8fE07KGZ1bmN0aW9uKGMpe2MuZmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5BZClpZih0aGlzLmdifHwodGhpcy5nYj0wKSx0aGlzLmdiKyssMTU8dGhpcy5nYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHRoaXMucnMoKSwhMDt0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm8oKTp0aGlzLm8oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEc9Yy5mbHx8RzsoZnVuY3Rpb24oYyl7Yy5obD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy53YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYi5ncyh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgaWM9Yy5obHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm11PXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMudG89YjtiLnByb3RvdHlwZT17bHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm11OnRoaXMubW4oYSl9LG1uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMudG98fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5sdSg0KTsoZnVuY3Rpb24oYyl7Yy5vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5VZT0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5SKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSwKe2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3JuOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuVWU9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3JuOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5vanx8bGM7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sV3U6ZnVuY3Rpb24oKXt9LFJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWUobmV3IGZ1bmN0aW9uKCl7fSk7YS5xdT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5ScihhKTsKd2luZG93Lnl1PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLlFyfHwodGhpcy5Rcj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRkfHwodGhpcy5EZD0xKTtpZigyMDx0aGlzLkRkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5EZCsrOwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmCmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuVyghMCl9LmJpbmQodGhpcykpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMubmp8fG1jOyhmdW5jdGlvbihjKXtjLnBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgbmM9Yy5wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmpuPXRoaXMuYVs0XTt0aGlzLnRtPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzhdfWMuRWg9YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbjp0aGlzLnNtKGEpfSwKc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgcGM9Yy5FaHx8cGMsbmQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bmQuTW0oNCk7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKTthJiZ0aGlzLk8oYS5wYXJlbnROb2RlKX0sSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFY9Yy5sanx8VjsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy53Zj0wO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT10aGlzLlhiPXRoaXMuVmE9dGhpcy5xYz0hMTt0aGlzLmFnPWYua2IoMTApO3RoaXMuRmYoKX0sRmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm8oITApOnRoaXMubygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmYuYmluZCh0aGlzKSwxMDApLCExfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSwKdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBXPWMua2p8fFc7KGZ1bmN0aW9uKGMpe2MubWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFYod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7CmVsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBWKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIHFjPWMubWp8fHFjLHJjPW5ldyBxYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VZz10aGlzLmFbNF07dGhpcy5waD10aGlzLmFbNV07dGhpcy5sbD10aGlzLmFbMl07dGhpcy5Eaj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs1XX1jLmtpPWI7Yi5wcm90b3R5cGU9e1RnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VZzp0aGlzLm9oKGEpfSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucGg6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sbDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGo6dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVpOnRoaXMuUW8oYSl9LFFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Sbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMua2l8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLlRnKDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLk8oYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5RaHx8dGM7KGZ1bmN0aW9uKGMpe2MuUGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsCmZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5vKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5QaHx8dWM7KGZ1bmN0aW9uKGMpe2MuUmg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGYuRGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkkoZCl8fCh0aGlzLkwoZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkgoKX19KX0pKGMpO3ZhciB2Yz1jLlJofHx2Yyx3Yz1uZXcgdmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJsPXRoaXMuYVsxMF07dGhpcy54az10aGlzLmFbM107dGhpcy5XbT10aGlzLmFbM107dGhpcy5jbj10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbM107dGhpcy50bj10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLnZyPWI7Yi5wcm90b3R5cGU9e0FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CbDp0aGlzLndrKGEpfSx3azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGs6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldtOnRoaXMuYm4oYSl9LGJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jbjp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua2s6dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRuOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgeGM9Yy52cnx8eGMscGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuJGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLk8oYiksdGhpcy5SKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHljPWMuJGh8fHljOyhmdW5jdGlvbihjKXtjLlpoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlBlKCl9LFBlOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5aaHx8emM7KGZ1bmN0aW9uKGMpe2MuYWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5qYSl7dGhpcy5IKCk7cmV0dXJufWlmKCF0aGlzLkkoYikpe3RoaXMuTChiKTsobmV3IHpjKGIsdGhpcy5BKSkuYigpO3RoaXMuSCgpO3JldHVybn19dGhpcy5IKCl9fSl9KShjKTt2YXIgQWM9Yy5haXx8QWMsQmM9bmV3IEFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsyXTt0aGlzLkNzPXRoaXMuYVsxXTt0aGlzLnRrPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVsxMF07dGhpcy5laz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs5XX1jLmpxPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IaTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRrOnRoaXMuY3IoYSl9LGNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuZHI6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5qcXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGY9dGhpcy5LZj10aGlzLkpmPSExO3RoaXMuVWM9W107dGhpcy4kZD17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcmM/bnVsbDpyYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBGYj9udWxsOkZiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFViP251bGw6VWIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHdiPwpudWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB4YT9udWxsOnhhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE1hP251bGw6TWEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgbmE/bnVsbDpuYX19Yy5waz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnJwKGEpOltdLGI7dGhpcy5LZj0hMDtpZihhLmxlbmd0aCl7dGhpcy5KZj0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPQphW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxycDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZFtjXSx0aGlzLm9lKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEpe3RoaXMub2UoYSkmJmEuYigpfSxKczpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuSmYpZm9yKHRoaXMuSGY9ITAsYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXRoaXMuVWNbYV0ucWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5VY1thXS5xYil9fX0pKGMpO3ZhciBEYz1jLnBrfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Q9dGhpcy5hWzRdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMV19Yy53bD1iO2IucHJvdG90eXBlPXtWdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3Q6dGhpcy5pdShhKX0saXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmp1OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qbDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEVjPWMud2x8fEVjLHJkPW5ldyBFYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLlZ0KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZi5UYihsLnd0KSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5UYihsLldxKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxiYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRj1uZXcgZ2Esaz0hMTtGLk1jKCk7Ri5CZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuTWMoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkJmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5NYygpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2YuZmlyZUV2ZW50KHdpbmRvdyxGLlhwKCkse2lkOnRkfSl9LDUwMCk7YWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bz10aGlzLmFbMV07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMueXM9dGhpcy5hWzEwXTt0aGlzLkpqPXRoaXMuYVsyXTsKdGhpcy5vdD10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzEwXTt0aGlzLklvPXRoaXMuYVsxXTt0aGlzLm5sPXRoaXMuYVs0XTt0aGlzLmFwPXRoaXMuYVs0XTt0aGlzLmRqPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzZdfWMuTWo9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZvOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5mdTp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Kajp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3Q6dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJqOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6CnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hcDp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLk1qfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC51byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmY9dGhpcy5jb25mPXRoaXMuVWE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLlBjPTA7dGhpcy5MYT0iIjt0aGlzLlZjPVtdO3RoaXMuV2M9MDt0aGlzLiRmPSExO3RoaXMuWWQ9W119Yy5MZz1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXt0aGlzLlpmPWF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGpzOmZ1bmN0aW9uKGEpe3RoaXMuVWE9YX0saHM6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5MYV0mJnRoaXMuY29uZlt0aGlzLkxhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTGFdW2FdKTtyZXR1cm4gYn0sYmM6ZnVuY3Rpb24oYSxiKXtmLmliKCJ3ZWx0LmRlIikmJmYuWGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpOwp2YXIgYz0hMSxlPSExO2lmKHRoaXMuWXAoKSl0aGlzLlVhLmModGhpcy5VYS5KYyx0aGlzLlVhLnphLHRoaXMuVWEuWmQsZnVuY3Rpb24oKXt0aGlzLmJjKGEsYil9LmJpbmQodGhpcyksdGhpcy5VYS5CYyk7ZWxzZSBpZih0aGlzLkVwKCkpdGhpcy5jcyhmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YuRChsLnljLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkxzKCk7ay5leGl0RnVsbHNjcmVlbigpO1E9az1uZXcgTyhrLHRoaXMuVWEsaCk7ay5nZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5LcShhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpOwpoLmFkU3RhcnRUaW1lb3V0JiYoZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5KZChhLGMsZSk7dGhpcy5wbGF5ZXIuaGcoayl9fSxZcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlBjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuUGMuZ2V0VGltZSgpLHRoaXMuUGM9YSwzRTU8Yj8hMDohMTt0aGlzLlBjPWE7cmV0dXJuITF9LEFzOmZ1bmN0aW9uKCl7Zi5lZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmFmKGEpKT90aGlzLmJjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfSx6czpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLm9zKCEwKTsKdmFyIGI9dGhpcy5jb25mLGM9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5hZihjKSk/dGhpcy5iYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9fSxhZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sVHI6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50cyh0aGlzLnpzLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmVhKCl9LCRjOmZ1bmN0aW9uKGEpe2YuZWUoIm1pZHJvbGwiKTtpZighdGhpcy5PZil7dGhpcy5PZj0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuYmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2Y9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LFNyOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIubnModGhpcy4kYy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5BcygpO3RoaXMucGxheWVyLk5kJiZ0aGlzLlNyKCk7dGhpcy5UcigpfSxVcjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLlZjLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5rdShhLGIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlciwKYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLldjPXRoaXMuVmMubGVuZ3RofSxFcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5XYyYmKGE9ITApO3JldHVybiBhfSxjczpmdW5jdGlvbihhKXt0aGlzLiRmPWE7Zm9yKGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl0aGlzLlZjW2FdWyJmdW5jdGlvbiJdKHRoaXMuSXIuYmluZCh0aGlzKSl9LElyOmZ1bmN0aW9uKGEpe3RoaXMuV2MtLTthJiZ0aGlzLllkLnB1c2goYSk7MD49dGhpcy5XYyYmdGhpcy4kZigpfSxLcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5ZZC5sZW5ndGg7YysrKWI9dGhpcy5ZZFtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZGE9Yy5MZ3x8ZGEsUT0hMSxqYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaD10aGlzLmFbN107CnRoaXMuWGc9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMucG49YjtiLnByb3RvdHlwZT17emg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFoOnRoaXMuV2coYSl9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdjPWMucG58fEdjLHZkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnpoKDQpfSkuY2FsbChWb3B1V3VpdlhhaExpb1llLFZvcHVXdWl2WGFoTGlvWWUpOwo=
Protocol
HTTP/1.1
Server
176.9.3.108 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.108.3.9.176.clients.your-server.de
Software
AmazonS3 /
Resource Hash
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://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
Wed, 11 Jul 2018 20:06:01 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
http://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
de4-homad-5
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
a.mp4
videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/
1 MB
0
Media
General
Full URL
https://videos.chip.de/p/1741931/sp/174193100/serveFlavor/entryId/1_hiudllfs/v/1/flavorId/1_ic7s7561/name/a.mp4
Protocol
HTTP/1.1
Server
2a02:26f0:eb:1a1::bf0 , European Union, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
nginx/1.8.0 /
Resource Hash

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
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=2424832-

Response headers

Date
Wed, 11 Jul 2018 20:06:01 GMT
Access-Control-Allow-Methods
GET, HEAD, OPTIONS
X-Vod-Session
475377868
Content-Range
bytes 2424832-75873255/75873256
Connection
keep-alive
Content-Length
73448424
Last-Modified
Sun, 19 Nov 2000 08:52:00 GMT
Server
nginx/1.8.0
ETag
"3a1794b0-485bbe8"
X-Vod-Me
ny-front-vod1
Content-Type
video/mp4
Access-Control-Allow-Origin
*
Access-Control-Expose-Headers
Server,Content-Length,Content-Range,Date
Cache-Control
max-age=3350636
Accept-Ranges
bytes
Access-Control-Allow-Headers
Origin,Range,Accept-Encoding,Referer,Cache-Control
Expires
Sun, 19 Aug 2018 14:49:57 GMT
hic_qos
ssl.1.damoh.chip.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.chip.de/hic_qos?adv_partner&_werbebanner_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvcHVXdWl2WGFoTGlvWWU9Vm9wdVd1aXZYYWhMaW9ZZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWGEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLmpzKG0pLGEuaHMoayksYS5VcigpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2o9dGhpcy5hWzFdO3RoaXMuUmc9dGhpcy5hWzZdO3RoaXMuUGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNF19Yy5OZz0KYjtiLnByb3RvdHlwZT17Tmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9qOnRoaXMuUWcoYSl9LFFnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SZzp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYT1jLk5nfHxlYSxIYz1uZXcgZWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1IYy5Oaig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5FYT0ic2V0dXAiO3RoaXMuZGM9W107dGhpcy5TZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkhyLmJpbmQodGhpcykpfWMubmk9YjtiLnByb3RvdHlwZT17U2U6ZnVuY3Rpb24oKXt0aGlzLmxhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LG9tOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YS5wb3N0TWVzc2FnZShiLCIqIil9LEdhOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxIcjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5HcihhLmRhdGEpfSxHcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMubGEuZXZlbnRsaXN0ZW5lci5sZW5ndGg7YisrKWEuZXZlbnQ9PQp0aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSxyZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxtbTpmdW5jdGlvbihhLGIpezA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sYmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7Zm9yKHZhciBkPTA7ZDx0aGlzLmxhLmVycm1zZy5sZW5ndGg7ZCsrKWIrPSJcbiIrdGhpcy5sYS5lcnJtc2dbZF07dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxEYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT0KdHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxoZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSXM6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sRGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9MCxjPTAsaD0wLGY9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7ZT11LmhlaWdodDswPnUudG9wJiYoZSs9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZS09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYKKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5lJiYoZT0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCplKTtoPj1iJiYoZj0hMCk7cmV0dXJuIGZ9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSwKQmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGU7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZT1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitlLGJ8PTA7cmV0dXJuIGJ9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGcrPWUudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxjLGg9QXJyYXkoODApLGY9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZT0wO2U8bi0zO2UrPTQpYz1hLmNoYXJDb2RlQXQoZSk8PDI0fGEuY2hhckNvZGVBdChlKzEpPDwxNnxhLmNoYXJDb2RlQXQoZSsyKTw8OHxhLmNoYXJDb2RlQXQoZSszKSwKcC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGUpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKyloW2VdPXBbYStlXTtmb3IoZT0xNjs3OT49ZTtlKyspaFtlXT1kKGhbZS0zXV5oW2UtOF1eaFtlLTE0XV5oW2UtMTZdLDEpO2M9ZjtuPXU7bD1rO3c9STtxPW07Zm9yKGU9MDsxOT49ZTtlKyspcj1kKGMsNSkrKG4mbHx+biZ3KStxK2hbZV0rMTUxODUwMDI0OSYKNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTIwOzM5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT00MDs1OT49ZTtlKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXI9ZChjLDUpKyhuXmxedykrcStoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2Y9ZitjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihmKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx3YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxlLGMsaCxmLHUsaz0wO2s8YS5sZW5ndGg7KWQ9CmEuY2hhckNvZGVBdChrKyspLGU9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LGY9KGUmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGUpP2Y9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sZ3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZT0hMSxjPSExLGg9ITEsZj0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtlPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRtPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGY9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1lO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1mO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxlcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuV2UoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxXYTpmdW5jdGlvbigpe3ZhciBhPXtZZzpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKamg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sWWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFltOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWcoKXx8YS5qaCgpfHxhLkdwKCl8fGEuWWooKXx8YS5DbCgpfX07cmV0dXJuIGEuWW0oKX0sS2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbYltlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGU9MCxjPWEubGVuZ3RoO2U8YzsrK2UpYi5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxiW2FbZV1dPTEpO3JldHVybiBkfSxvZjpmdW5jdGlvbihhKXthPXRoaXMuS2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSwkbjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxlPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8ZS5wdXNoKGFbY10pO3JldHVybiBlfSxGczpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGU9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZT1hLnNwbGl0KCIlIiksZD1iLzEwMCplKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGVmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54ZyhiKSsiOiIrdGhpcy54ZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZTpmdW5jdGlvbihhKXt0aGlzLkVhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU7ZC5zdGF0ZT10aGlzLkVhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2U9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGUpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxlLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5GYyhiLGQpKTtiJiYoaD1sLkZjKGEsYikpO2UmJihoPWwuRmMoaCxlKSk7YyYmKGg9bC5GYyhoLGMpKTtmLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBlPW0uYWUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uVGEoZSwhMCk7ZT1tLlRhKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRmEoZSxmdW5jdGlvbihkKXt2YXIgZT0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZT0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZT0hMSl9Y2F0Y2goYyl7fWV8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLAooZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oKXttJiZtLlk/bS5pc0VuYWJsZWQmJm0ueG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2QoKX0uYmluZCh0aGlzKSw1MDApfSxxbjpmdW5jdGlvbihhLGIpe2lmKGIuT2MoYSl8fCJhYm91dDpibGFuayI9PWF8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLmJmKGEpKXJldHVybiB0aGlzLmJmKGEpO3ZhciBkPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2QuaG9tYWRfdXJsX3N1ZmZpeD0KYTtkLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoYSk7ZC5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2QuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt2YXIgZT0hMSxjPSExLGM9dGhpcy5YYShhLGIudWEsZCxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWMpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMubW0oZSxhKTtyZXR1cm4gZX0sWGE6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZix1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suVGEoYSxoKTtoPWsuVGEoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5GYShoLGUsYywiIiwiIixmKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoYSxiLGQsZSxjLGssZix1KX0uYmluZCh0aGlzKSw1MDApfSxGcTpmdW5jdGlvbihhLGIsZCxlLGMsaCxmKXt2YXIgdT0hMDtmJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtmPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZilkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGZba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZShsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sR3E6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRnEoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZGMpZm9yKHZhciBjIGluIHRoaXMuZGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5kY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2Yud2IoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTWY6ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5YYShhLGUudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkdxKGUuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZSwhMCl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRjPWF9LGt1OmZ1bmN0aW9uKGEsYixkLGUsYyl7dGhpcy5YYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmV9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX0pfSxabTpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LGJxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLm5pfHxQO25ldyBQO3ZhciBmPW5ldyBQO3dpbmRvdy5CdT1mOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1pPWI7Yi5GYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGU7Zm9yKGUgaW4gYilkW2VdPWJbZV07Zm9yKGUgaW4gYSlkW2VdPWFbZV07cmV0dXJuIGR9O2IudXI9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnE9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ0PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuSm89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZtPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLiRsPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5jbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5obT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWmw9e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLmFtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuenQ9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVxPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLktvPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdT17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Mbj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlFuPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuemM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuZW09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5JZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuSGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuaW09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5ibT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iud3Q9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5XcT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMubWl8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHI9dGhpcy5hWzVdO3RoaXMuQXE9dGhpcy5hWzRdO3RoaXMuS249dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19CmMudXE9YjtiLnByb3RvdHlwZT17b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnByOnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5BcTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgZmE9Yy51cXx8ZmEsSmM9bmV3IGZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMub3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5vaT1iO2IucHJvdG90eXBlPXtCZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZSxjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBNYXRoLmFicyhiKX0sCmViOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxtcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxHYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTsKaWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxNYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5HYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYygpKyIyIn0sQmY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLm1wKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09CmIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5vaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueHI9dGhpcy5hWzhdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMuS2s9dGhpcy5hWzRdO3RoaXMudm09dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzVdO3RoaXMuZHQ9dGhpcy5hWzddO3RoaXMubnE9dGhpcy5hWzVdO3RoaXMuQmk9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbN119Yy5VaD1iO2IucHJvdG90eXBlPXt3cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueHI6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ0OnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lazp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudm06dGhpcy5hcyhhKX0sYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5iczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZHQ6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5xOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhhPWMuVWh8fGhhLEtjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLndyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGU9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZVtjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGdbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5pO3RoaXMuaT1kW2FdO3ZhciBlPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaT1nO3JldHVybiBlfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBlLmM/ZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2UuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1lO2UuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51ZT1ifSkoYyk7dmFyIEo9Yy51ZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbOF07dGhpcy54aT10aGlzLmFbOF07dGhpcy5ycj10aGlzLmFbNl07dGhpcy5odD0KdGhpcy5hWzNdO3RoaXMuVG89dGhpcy5hWzEwXTt0aGlzLllxPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuR3M9YjtiLnByb3RvdHlwZT17TWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5pOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGk6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJyOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odDp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVG86dGhpcy5YcShhKX0sWHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLkdzfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuTWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5vaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5rcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGtzOmZ1bmN0aW9uKGIpe3RoaXMuQT0KYn0sbHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxMOmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5lYigpXT1iO0smJksuS2YmJksuSnMoYil9LEp1OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmViKCldPyEwOiExfSxmcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFh1OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMub2t8fHI7KGZ1bmN0aW9uKGMpe2MucWs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9Cm51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuZmI9IiI7dGhpcy5ZZT0hMTt0aGlzLk4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSx0czpmdW5jdGlvbihiKXt0aGlzLko9Yn0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxuczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LEl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LAppc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxZdTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcCgpfHx0aGlzLmptKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEx1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGptOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPwohMDohMX0sTzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxDYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxoYjpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmZiPQpifSxIdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZifSxXcjpmdW5jdGlvbigpe3RoaXMuZmI9bnVsbH0sTnU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmZiJiYoYj0hMCk7cmV0dXJuIGJ9LFR1OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxFdTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5xa3x8cDsoZnVuY3Rpb24oYyl7Yy5NZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLlZsPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuS2U9dGhpcy5CZz0hMTt0aGlzLnN0YXR1cz10aGlzLmljO3RoaXMuaWQ9Zi5wYSgxMCk7dGhpcy5ZYyhiKTt0aGlzLmxzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLnFzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy50YiYmMDx0aGlzLnRiLmxlbmd0aCYmKHRoaXMudGI9Zi51bmlxdWUodGhpcy50YiksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sTXU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LHFzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuRWV9LHJzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5WbH0sQ2I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGxzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxscDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEpxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5NZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hbz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLlNnPWI7Yi5wcm90b3R5cGU9CntGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlNnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Gbyg0KTsoZnVuY3Rpb24oYyl7Yy5yaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LApwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLnJofHxSOyhmdW5jdGlvbihjKXtjLnFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuR3Q9MUUzO3RoaXMuV2Y9bnVsbDt0aGlzLml0PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy4kbSliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLllvLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5CcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLkFwKGEsCmIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuSnQoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLkt0KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuenAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sT246ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxKdDpmdW5jdGlvbihiKXt0aGlzLmdkfHwodGhpcy5nZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTHQoYil9LmJpbmQodGhpcyksdGhpcy5HdCkpfSxMdDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCk7dGhpcy53KCl9LEt0OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdkKX0sCnpwOmZ1bmN0aW9uKGIpe3RoaXMuenUoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuRHI8dGhpcy5pdD90aGlzLncoKTp0aGlzLm0oKX0sQnA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxZbzpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXt0aGlzLkRyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMucWh8fGxhOyhmdW5jdGlvbihjKXtjLnNoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGYuRGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgUihiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBsYShnLAp0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5zaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs3XTt0aGlzLkptPXRoaXMuYVs0XTt0aGlzLnJtPXRoaXMuYVs4XTt0aGlzLlVtPXRoaXMuYVs4XTt0aGlzLlNzPXRoaXMuYVsxXTt0aGlzLkRuPXRoaXMuYVs0XTt0aGlzLll0PXRoaXMuYVs1XTt0aGlzLnJsPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuSW49YjtiLnByb3RvdHlwZT17Ums6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNrOnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KbTp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm06dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMuUnMoYSl9LApSczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3M6dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRuOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5Jbnx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMuUmsoNCk7KGZ1bmN0aW9uKGMpe2MuWmk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT0KYi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSx0aGlzLmVxPSEwKTt0aGlzLlIoYSk7dGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmVxKXt0aGlzLmNxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksCjUwKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT0KYi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxoYjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7CnZhciBwYT1jLlppfHxwYTsoZnVuY3Rpb24oYyl7Yy5ZaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5hYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYWI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJgoodGhpcy5DYigpLHRoaXMuZ2V0UGxheWVyKCkuUG49ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmZiO2EmJihhLlRkKCksYS5BYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTsKaWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlBmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToKKHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm1jLmxlbmd0aD49dGhpcy5wZCYmdGhpcy5vKCkpfSxKcTpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtmLklzKGEudmlkZW9UYWcpJiYoYS5jcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLllpfHxxYTsoZnVuY3Rpb24oYyl7Yy4kaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmlwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYKIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHBhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5JKGcpfHx0aGlzLmZxKGcpfHwodGhpcy5MKGcpLGc9bmV3IHFhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGlwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy4kaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1rPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs5XTt0aGlzLlNwPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy5IcD1iO2IucHJvdG90eXBlPQp7bGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56aTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB0YT1jLkhwfHx0YSxPYz1uZXcgdGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1PYy5sayg0KTsoZnVuY3Rpb24oYyl7Yy5HbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLk8oYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlIoYik6dGhpcy5IKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTt2YXIgdWE9Yy5HbHx8dWE7KGZ1bmN0aW9uKGMpe2MuRmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHZhPWMuRmx8fHZhOyhmdW5jdGlvbihjKXtjLkhsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYwPGYuRGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9Cm5ldyB1YShnKSx0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyB2YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19KX0pKGMpO3ZhciB3YT1jLkhsfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGc9dGhpcy5hWzldO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzVdO3RoaXMudXQ9dGhpcy5hWzNdO3RoaXMuT2g9dGhpcy5hWzRdO3RoaXMuc289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5IbT1iO2IucHJvdG90eXBlPXtPZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUGc6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kcTp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnV0OnRoaXMuTmgoYSl9LE5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PaDp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB5YT1jLkhtfHx5YSxQYz1uZXcgeWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5PZyg0KTsoZnVuY3Rpb24oYyl7Yy51bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5PKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmI/dGhpcy5SKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5KJiZ0aGlzLkooKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/CmIuYXV0b3BsYXkoKTohMX0samI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLnVsfHx6YTsoZnVuY3Rpb24oYyl7Yy50bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMudW4oKTsKdGhpcy5IYSgpfSxVdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFZiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj0KdGhpcy5TYSgpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLlhiPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlhifSxhcTpmdW5jdGlvbigpe2lmKCF0aGlzLnhmKXt2YXIgYj10aGlzLlNhKCksYT10aGlzLlpwKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LFpwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuV2EoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5XKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sRnU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSx1bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8CmIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFxKCkpe3ZhciBhPXRoaXMuU2EoKSxnPXRoaXMuVmIoKTthJiZnJiYodGhpcy5TYSgpLHRoaXMuVmIoKSx0aGlzLnRkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGQ/dGhpcy5tKCk6KHRoaXMuVyghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuU2EoKX1lbHNlIHRoaXMueWY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fAp0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2bjpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/Cih0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLnpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLnpnLGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxBbjpmdW5jdGlvbigpe3RoaXMuUHV8fCgxMDx0aGlzLkh0Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5IdCsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLlZyKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTApKSl9LFZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5JdCl7dGhpcy5JdD0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQWE9Yy50bHx8QWE7KGZ1bmN0aW9uKGMpe2Mudmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPApmLkRhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IHphKGJbZ10pLGEuamF8fHRoaXMuSShhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgQWEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSDpmdW5jdGlvbigpe3RoaXMucWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5hYyl9fSl9KShjKTt2YXIgQmE9Yy52bHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZpPXRoaXMuYVszXTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLnN0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuZ3I9YjtiLnByb3RvdHlwZT17dWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZpOnRoaXMuSnIoYSl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuS3I6dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5ncnx8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMudWkoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5PKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGhiOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMuWGt8fEVhOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoITApOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy53KCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5tKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWMuYmluZCh0aGlzKSwxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksCnRoaXMubSgpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLnpiJiYodGhpcy56Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWN8fCh0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpOwpiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuZWM9ITAsdGhpcy5tKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMuV2t8fEZhOyhmdW5jdGlvbihjKXtjLllrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmCnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgRWEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEZhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBHYT1jLllrfHxHYSxIYT1uZXcgR2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzRdO3RoaXMudms9dGhpcy5hWzJdO3RoaXMuaHU9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzldO3RoaXMudHI9dGhpcy5hWzNdO3RoaXMucHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbM119Yy5mbz1iO2IucHJvdG90eXBlPXtVbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVm86dGhpcy51ayhhKX0sdWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZrOgp0aGlzLmd1KGEpfSxndTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaHU6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhqOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy50cjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5mb3x8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuVW8oNCk7KGZ1bmN0aW9uKGMpe2MuYmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlOwp0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy5iaHx8SmE7KGZ1bmN0aW9uKGMpe2MuYWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTsKYi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMuYWh8fEthOyhmdW5jdGlvbihjKXtjLmRoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLApkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBKYShkLGEpLHRoaXMuSShkKXx8KGQuTGQoYSksdGhpcy5MKGQpLGQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy5kaHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVsyXX1jLmpqPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54bzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIE5hPWMuamp8fE5hLFNjPW5ldyBOYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53byg0KTsoZnVuY3Rpb24oYyl7Yy51aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5PKGIpO3RoaXMuUihiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJgowPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBPYT1jLnVqfHxPYTsoZnVuY3Rpb24oYyl7Yy50aj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5XYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5sYygpfSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD8KYi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFBhPWMudGp8fFBhOyhmdW5jdGlvbihjKXtjLnZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgT2EoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBQYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgUWE9Yy52anx8UWEsUmE9bmV3IFFhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzRdfQpjLmFuPWI7Yi5wcm90b3R5cGU9e2tuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIFNhPWMuYW58fFNhLFRjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLmtuKDQpOyhmdW5jdGlvbihjKXtjLmJrPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuVWQ9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmRhKCk7cmV0dXJufXRoaXMuTyhhKTsKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUihiKTp0aGlzLmRhKCl9LEVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmIsZz10aGlzLmViKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLlRkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5VZD0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LGpiOmZ1bmN0aW9uKCl7dGhpcy5VZCsrOwppZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sSzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZWE6ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9fSl9KShjKTsKdmFyIFRhPWMuYmt8fFRhOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5nYnx8KHRoaXMuZ2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5nYisrLDE1PHRoaXMuZ2IpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuVmEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMuV28/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsCmZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLldvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5FcihhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgVWE9Yy5ha3x8VWE7KGZ1bmN0aW9uKGMpe2MuY2s9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IFVhKGEsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBWYT1jLmNrfHxWYSxXYT1uZXcgVmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGw9dGhpcy5hWzddO3RoaXMuTG09dGhpcy5hWzVdO3RoaXMuV2g9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsyXTt0aGlzLmpyPXRoaXMuYVsxMF07dGhpcy5SaT10aGlzLmFbOF07dGhpcy5wbD10aGlzLmFbN107dGhpcy54aj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsxMF19Yy5kcz1iO2IucHJvdG90eXBlPXtTbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlRsOnRoaXMuS20oYSl9LEttOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG06dGhpcy5WaChhKX0sVmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldoOnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lbzp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuanI6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJpOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbDp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBYYT1jLmRzfHxYYSxVYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0KVWMuU2woNCk7KGZ1bmN0aW9uKGMpe2MuaWk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLk8oYi5lbGVtZW50KTt0aGlzLlIoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgWWE9Yy5paXx8WWE7KGZ1bmN0aW9uKGMpe2MuaGk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBaYT1jLmhpfHxaYTsoZnVuY3Rpb24oYyl7Yy5qaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgWWEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFphKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgJGE9Yy5qaXx8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsyXTt0aGlzLlhpPQp0aGlzLmFbMTBdO3RoaXMuV3A9dGhpcy5hWzEwXTt0aGlzLmNpPXRoaXMuYVsxXTt0aGlzLkR0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuaHI9YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pazp0aGlzLldpKGEpfSxXaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGk6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2k6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgYmI9Yy5ocnx8YmIsVmM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuaGsoNCk7CihmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0saGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sem46ZnVuY3Rpb24oKXtmLkRmKHRoaXMuRGMpO2YuRWYodGhpcy5EYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpuKCl9LmJpbmQodGhpcyksNTApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgY2I9Yy5UaXx8Y2I7KGZ1bmN0aW9uKGMpe2MuU2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGRiPWMuU2l8fGRiOyhmdW5jdGlvbihjKXtjLlVpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiYKay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBlYj1jLlVpfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQnI9dGhpcy5hWzFdO3RoaXMuem89dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzJdO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuUWs9dGhpcy5hWzldO3RoaXMuJHQ9dGhpcy5hWzJdO3RoaXMuZmg9dGhpcy5hWzVdO3RoaXMuTGk9dGhpcy5hWzEwXTt0aGlzLnltPQp0aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLndtPWI7Yi5wcm90b3R5cGU9e0FyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ccjp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem86dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZyOnRoaXMucG8oYSl9LHBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xbzp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFrOnRoaXMuWnQoYSl9LFp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJHQ6dGhpcy5laChhKX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZoOnRoaXMuS2koYSl9LEtpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaTp0aGlzLnhtKGEpfSx4bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueW06dGhpcy5EbChhKX0sRGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRWw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy53bXx8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuQXIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnBpPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sa206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5waXx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwyMDAhPWYuc3RhdHVzJiYyMDEhPWYuc3RhdHVzfHxnKGYpO2lmKGQmJjQ9PWYucmVhZHlTdGF0ZSYmMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1cylkKGYpO2Vsc2UgaWYoND09Zi5yZWFkeVN0YXRlJiYwPT1mLnN0YXR1cyYmbSYmbS5GZCh0aGlzLklhLnVybCkmJm0uZGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLm1zKCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMucmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZGYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLm5nP3RoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMSk6dGhpcy5OYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCEwKSx0aGlzLktnfHwodGhpcy5OYS53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiZtLkZkKHRoaXMuSWEudXJsKT9tLmRkP20uZ2EoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uRmQodGhpcy5JYS51cmwpLHRoaXMuVGYmJnRoaXMuVGYoKX1yZXR1cm4gdGhpcy5OYX19fSkoYyk7dmFyIGhiPWMucml8fGhiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLk9iPSIiO3RoaXMudWQ9dGhpcy5iYj1udWxsO3RoaXMuYW89dGhpcy5uYj10aGlzLkxmPSExO3RoaXMudWE9IiI7dGhpcy5HZj0hMTt0aGlzLnphPXRoaXMuSmM9IiI7dGhpcy5DZj10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5oYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSGI9IiI7dGhpcy5vYj1bXTt0aGlzLkliPVtdO3RoaXMuR2I9IiI7dGhpcy5sZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNkPSExO3RoaXMuQm49dGhpcy5lZD1udWxsO3RoaXMuZmM9dGhpcy5BZz10aGlzLm5lPXRoaXMuZGQ9dGhpcy52ZD10aGlzLmpjPSExO3RoaXMuUGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fQpjLnNpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLmFvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuR2YsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMuemEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5ZLGlzQmxvY2tlZDp0aGlzLkNmLHNlcnZlcjp0aGlzLk1hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMudGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy55ZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5rZSxIT01BRF9WRVJJRklFRDp0aGlzLnllLEhPTUFEX0JMT0NLRUQ6dGhpcy53ZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5zYiwKSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkJuLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuamMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnZkLHVzZVN0cmljdENoZWNrczp0aGlzLmRkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUGEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMuZmcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuZmN9fSxEcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYKMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxqcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1mLlptKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5PYnx8dGhpcy5iYnx8dGhpcy51ZCkmJihrPXRoaXMuUXEoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5rcChmLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LApPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxaYjpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5NYSYmdGhpcy5NYS5sZW5ndGgmJjA8dGhpcy5NYS5sZW5ndGgmJihiPXRoaXMuTWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGtwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnh1O3JldHVybiJub25lIn0sTGM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYVt0aGlzLmZnXX0sYWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLmpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LFFxOmZ1bmN0aW9uKGEpe3RoaXMuT2ImJgooYSs9dGhpcy5PYik7aWYodGhpcy5iYilmb3IodmFyIGIgaW4gdGhpcy5iYil0aGlzLmJiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmJiW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj1oO3RoaXMuRXEoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuemEpdGhpcy5DcSgpO2Vsc2UgdHJ5e3RoaXMuemE9YigpLHRoaXMud2MoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEVxOmZ1bmN0aW9uKCl7dGhpcy5GYShuZXcgeih0aGlzLkpjK3RoaXMub2MoImdsb2JhbCIpKSwKdGhpcy55cC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxDcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnZkKXt0aGlzLnZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwppZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMud2UpKTt0aGlzLnJiKCk7Zi5UYihsLnVyKTsoYj1mLm9mKHRoaXMuTGMoKSkpfHwoYj1mLm9mKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx5cDpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDsKdGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuemF9ZWxzZSBhPXRoaXMuemE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5NYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMudGY9YS5hZHBhdGh8fCIiO3RoaXMueWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5mZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5NYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiYKdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5hZSgpKSxjPXRoaXMuS2EodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMub2MoImN1c3RvbWVyIikpO3RoaXMuRmEoYix0aGlzLk1zLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNlKCJjdXN0b21lciIpO2E/dGhpcy5Haz90aGlzLmdhKCJub1NWTUNvbmZpZyIpOgoodGhpcy5Haz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LE1zOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLm5lPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuQWc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLm9iPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5zcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMueWQmJih0aGlzLkdiPW51bGwpO3RoaXMubGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5DZCYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuQ2Q9ITAsdGhpcy5RYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5mdCgpJiYodGhpcy5IYnx8dGhpcy5JYnx8dGhpcy5vYnx8dGhpcy5HYik/dGhpcy5aZD8odGhpcy5vYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuc2IpKSwKdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5WcygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLldzKCkpfX0sVnM6ZnVuY3Rpb24oKXt0aGlzLlVzKCl9LFdzOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYShhKSksdGhpcy5yYigpLHRoaXMud2QoKSl9LFVzOmZ1bmN0aW9uKCl7aWYodGhpcy5IYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5xZygpfWVsc2UgdGhpcy5xZygpfSxwZzpmdW5jdGlvbigpe3ZhciBlO3ZhciBjO2Z1bmN0aW9uIGEoKXtlPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlpzKGUsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5pZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuY2QodGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfXRoaXMub2I9bnVsbCx0aGlzLmllKCl9LFpzOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7ZigpJiYKYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy4kcyhlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuSWImJnRoaXMuSWIubGVuZ3RoKXt2YXIgYz10aGlzLkliLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGcoKX0sJHM6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoKXtoKCkmJmIoKX1mdW5jdGlvbiBmKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7bC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtsLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2wub25sb2FkPWU7bC5vbmVycm9yPWY7bC5zcmM9YTtsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChtKXtlKCl9fSxpZTpmdW5jdGlvbigpe3RoaXMuR2I/KHRoaXMua2UrKyx0aGlzLkZhKG5ldyB6KHRoaXMuR2IpLHRoaXMuVHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuamUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5vZygpfSxqZTpmdW5jdGlvbihhKXt0aGlzLmNkKHRoaXMueGUsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVHM6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLm9nKCk6dGhpcy5qZSgiQUFBIil9LG9nOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpO3RoaXMud2QoKX0scmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7Zi5XYSgpJiYoYT0iMSIpO3RoaXMuamMmJihiPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnllKSk7dGhpcy5lZCYmImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSx5bjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuRHAoKSl7dmFyIGE9dGhpcy5qcCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxGYTpmdW5jdGlvbihhLGIsYyxlLGgsSWMpe2E9bmV3IGhiKGEsYixjKTtlJiYoYS5LZz0hMCk7aCYmZi5ncSgpJiYoYS5kZj0hMCk7SWMmJihhLm5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LE9lOmZ1bmN0aW9uKCl7Zi5XYSgpfHxmLlhhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSwKZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtlPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuWmIoKXx8KGE9dGhpcy5LYShlKSxlPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PQpoLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx4bjpmdW5jdGlvbigpe3RoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiOwphLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy55dC5iaW5kKHRoaXMpLHRoaXMueHQuYmluZCh0aGlzKSl9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXtyZXR1cm59Y3x8dGhpcy5MbygpfSx4dDpmdW5jdGlvbigpe30sTG86ZnVuY3Rpb24oKXtmLlRiKGwuS28pO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHdkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMubmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5uYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLm5iW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZmLlhhKGIudXJsLApiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LGZ0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZSxmLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLAplPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGU9MTQ7ZS0tOyljW2JbZV1dPWFbZV18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxmLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGUpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTIwOzM5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT00MDs1OT49ZTtlKyspeD1jKGYsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXg9YyhmLDUpKyhuXnBedykrdCtoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsCmY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuc2l8fGliLG09bmV3IGliO3dpbmRvdy5DdT1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLnlxPXRoaXMuYVsxXTt0aGlzLnJxPXRoaXMuYVs4XTt0aGlzLmtvPXRoaXMuYVs0XTt0aGlzLlV0PXRoaXMuYVs1XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnF0PXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVsxMF07dGhpcy5HbT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs4XX1jLk1wPWI7Yi5wcm90b3R5cGU9e1ZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Xbjp0aGlzLnhxKGEpfSwKeHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlxOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ycTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua286dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlV0OnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5kbDp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXQ6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxwOnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBqYj1jLk1wfHxqYixYYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuVm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5YbT0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5wbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTsKdGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMuanQ9dGhpcy4kYT0hMX1jLmxpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiZ0aGlzLmNvbmZbdGhpcy5MYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLkxhXVthXSk7cmV0dXJuIGJ9LHVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkVhJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLAoiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLmRtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLiRhPWM7aWYodGhpcy5ULlkpdGhpcy5ULnluKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDohMH0pKTp0aGlzLkFhKCk7ZWxzZXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLkpkKGEsYixjKX0sNTApfX0sVmQ6ZnVuY3Rpb24oYSl7dGhpcy5FYz0KITE7dGhpcy5zPWE7dGhpcy51cyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMudXAoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sdXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8ZS5sZW5ndGg7aysrKWVba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLAplW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlP2YuRChsLlJ0LHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk6KGYuS2QoKSxiPT1DLkJlLmNvZGUmJmYuRChsLlVxLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpO2YuRChsLkpvLHRoaXMucy5QLHRoaXMuai51LkIoKSwKdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC56dCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5hdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuZHUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuVnEsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSxmLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGYudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsCiIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sdXM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuVnU9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249CnRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5wbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMubG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLm5tKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5NbigpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnNzKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sc3M6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmZi5vbSh0aGlzLnMub3JpZ2luLnRlKTtmLlphKCJzZXRVcFZwYWlkIik7dmFyIGI9dGhpcy5qLkM7dGhpcy5qLkM9Qi5wb3AoKTtiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuai5DLApiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5qLkcuYXBwZW5kQ2hpbGQodGhpcy5YKTt0aGlzLlgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zLndwKCksYz1hKHRoaXMucy5QLk9yaWdpbmFsQWRQYXJhbWV0ZXJzKSwKZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7Yj1mLnFuKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTXQoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnQoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF0KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB0KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk90KCkpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcykpOwpmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LE50OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LE10OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuWmEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuWmEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuWmEoImZpcnN0UXVhcnRpbGUiKX0sUXQ6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi5aYSgidGhpcmRRdWFydGlsZSIpfSxQdDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5aYSgiY29tcGxldGUiKX0sT3Q6ZnVuY3Rpb24oKXtmLlphKCJhZHN0b3BwZWQiKTt0aGlzLkFhKCl9LGxtOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7dmFyIGU9YixmPXRoaXMuVDsKZi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLkZ0LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxubTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LFhjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IiwKdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG0pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuV2EoKSYmdGhpcy5ULkFnJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5zLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5BYnx8KHRoaXMuQWI9ITAsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLlQuZ2EoInZpZGVvLW5vb3AiKSk7CnJldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLkV0KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9dGhpcy5qLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuS2MucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCmZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5CYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmhlKCkpfS5iaW5kKHRoaXMpOwp0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5abCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LEZ0OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5FZCgpPwp0aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuanQpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm10KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5nZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5rZyk7YyYmKGI9dGhpcy5zLmdlLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwuZW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5wYy5yZXBsYWNlKCJbdGltZV0iLGYuZWYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5wcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5jYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLnduLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0scHA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLlpiKCkmJihmPWguS2EoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7ZS51cmw9ZjthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKd246ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtdDpmdW5jdGlvbihhKXthPT10aGlzLndnfHx0aGlzLkFifHwoMD09YSYmKHRoaXMuJGEmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuJGEpLHRoaXMuJGE9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuV2EoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGYuRChsLmFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi5EKGwuZm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSx0aGlzLlJiJiZmLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLiRsLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC5jbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5EKGwuaG0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSksZi5EKGwuaW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSwKdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnZwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmJxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YuRChsLmJtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSx7YWRJZDp0aGlzLmJkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5JZChlLnVybCxlLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy55YT10aGlzLlhuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5rbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0sdnA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxYbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxFdDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSxFZzpmdW5jdGlvbigpe2YuRChsLkxuLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkVjJiZmLldhKCkmJmYudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZi5lcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMua3QuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5XYi5iaW5kKHRoaXMpKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9lLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtlLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5nZSYmYS5hcHBlbmRDaGlsZChlKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LmhiJiZ0aGlzLmoudS5oYigpJiZ0aGlzLlJxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxsdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEJiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5jYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhkKCl9ZWxzZSB0aGlzLnhkKCl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMDt0aGlzLmouc2YoKTsKdGhpcy5qLlpyKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5XcigpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGYuRWYodGhpcy52aWRlbyxhKT90aGlzLllyKCk6dGhpcy5UZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmxpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVs4XTt0aGlzLmdpPXRoaXMuYVsyXTt0aGlzLkJvPXRoaXMuYVsxMF07dGhpcy5KbD10aGlzLmFbN107dGhpcy5Iaj10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLlFtPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/CnRoaXMuRG86dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk9yOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5naTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQm86dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iajp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy5RbXx8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuYWE9bnVsbDt0aGlzLk1iPSExO3RoaXMudGU9IiI7dGhpcy5zZT0hMTtkJiZkLmVtcHR5P3RoaXMuSXEoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5zbD1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5XZSgpLGI7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS5UYShtLktzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSHEuYmluZCh0aGlzKSx0aGlzLkRxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkVhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5FYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuRWEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwKMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxIcTpmdW5jdGlvbihhKXt0aGlzLlByKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSXE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQmEoeC5rZCkpfXRoaXMuYmE9dGhpcy5mZigpO3RoaXMuTWI9dGhpcy5yZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuUmMoKTp0aGlzLmZhKHRoaXMuQmEoeC5nYyx7ZXJyb3I6dGhpcy5zZT9DLmpkOkMuQWV9KSl9LERxOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkJhKHguemUse2RlcHRoOmF9KSl9LFJjOmZ1bmN0aW9uKCl7dGhpcy5hYT10aGlzLmJhLnNoaWZ0KCk7dGhpcy5pcSgpP3RoaXMuYXQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy52dCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSx2dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLllzKCk/dGhpcy5YcygpPyEwOigtMSE9dGhpcy5VYigpPwp0aGlzLmZhKHRoaXMuQmEoeC52ZSkpOnRoaXMuZmEodGhpcy5CYSh4Lm5oKSksITEpOih0aGlzLmZhKHRoaXMuQmEoeC5nYyxDLkJlKSksITEpfSxWZDpmdW5jdGlvbihhKXthLnlhPWEueWEuY29uY2F0KHRoaXMuTWQoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy5NYjt0aGlzLnBhcmVudC5WZChhKX0sU246ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbGI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMubGYoKTthLnZjPXRoaXMuZnAoKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLmJwKCk7YS5nZT10aGlzLnRwKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLmhwKCkpOmIueWEuY29uY2F0KHRoaXMubnAoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksCmE9MCx0aGlzLlJjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYSYmdGhpcy5wYXJlbnQuZmEoYiksYT0wKX0seGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQueGIoYSl9LCRlOmZ1bmN0aW9uKGEsYil7dGhpcy5mYSh0aGlzLkJhKGEsYikpfSxCYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBtYihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGF0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sWXM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxYczpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sUHI6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuc2U9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnFmKCkubGVuZ3RofSxxZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFwKHRoaXMuYWEsIlZBU1RBZFRhZ1VSSSIpfSxNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sCm5wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LGhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxmcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnliKHRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApBdTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy55YihhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LGJwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0KIiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMucmYoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2YucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sdHA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5GcyhnLGEpLDA+CmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxxcDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMueWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHhwOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx5YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJmKGEpOiIifSxyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnhwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5zbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gbj10aGlzLmFbMV07CnRoaXMuZnM9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzhdO3RoaXMuUWo9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy53aD1iO2IucHJvdG90eXBlPXtFbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRm46dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZzOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qbzp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBuYj1jLndofHxuYixaYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT0KW107dGhpcy52Yz0iIjt0aGlzLlA9dGhpcy52Yj0hMTt0aGlzLm9yaWdpbj1udWxsfWMubms9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sd3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBsYj1jLm5rfHxsYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scj10aGlzLmFbNl07dGhpcy5ZaD10aGlzLmFbMTBdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOV19Yy5IaD1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlloOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56cjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIG9iPWMuSGh8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5rcig0KTt2YXIgeD17a2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LG5oOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxnYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxDZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHplOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0saGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnB1Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSx2ZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17QWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sQmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0scnU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubnI9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbM119Yy5hcj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5yOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMuYXJ8fHBiLGFkPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLm1yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5LaD1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMuS2h8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naz10aGlzLmFbOF07dGhpcy5MbD10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbMTBdO3RoaXMuZW49dGhpcy5hWzldO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbMl19Yy5Maz1iO2IucHJvdG90eXBlPXtmazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2s6dGhpcy5LbChhKX0sS2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkpwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5Ma3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PWJkLmZrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMudGg9YjtiLnByb3RvdHlwZT17Z2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLiRwKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PQp3aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2UmJihoLnBvc2l0aW9uPWUpO3JldHVybiBofSxMczpmdW5jdGlvbigpe3RoaXMuSWY9ITB9LHlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sVmY6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtmLkQobC55Yyx0aGlzLnUuQigpKX0sWnI6ZnVuY3Rpb24oKXt0aGlzLklmfHwodGhpcy51LnBsYXkoKSxmLkQobC56Yyx0aGlzLnUuQigpKSl9LGNjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKwoicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlFhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUWEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUWEpO3RoaXMudS5EYiYmdGhpcy51LkRiKCk/dGhpcy51LmdmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy51Zi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sJHA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGdwOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LHVmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5RYSk7aWYoYi54IT10aGlzLlJhLnh8fGIueSE9dGhpcy5SYS55fHxiLnBvc2l0aW9uIT10aGlzLlJhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlJhLndpZHRofHxiLmhlaWdodCE9dGhpcy5SYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5SYS53aWR0aCYmMDx0aGlzLlJhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuc2YoKTtyZXR1cm59dGhpcy5SYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLnZmLmxlbmd0aDthKyspdGhpcy52ZlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxzZjpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkcpO3RoaXMuQyYmdGhpcy5DLnBhdXNlJiZ0aGlzLkMucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBOPWMudGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0KImJsb2NrIjtMLmlkPWYucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLFk9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vbz10aGlzLmFbOF07dGhpcy4kZz10aGlzLmFbMTBdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuQW09dGhpcy5hWzEwXTt0aGlzLkVtPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzhdfWMuZXQ9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9vOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kZzp0aGlzLnZzKGEpfSwKdnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLndzOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQW06dGhpcy5EbShhKX0sRG06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgc2I9Yy5ldHx8c2IsY2Q9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2Qubm8oNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpOwp0aGlzLk8oYSk7dGhpcy5mZShiKTt0aGlzLlhlKCl9LGZlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQ2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlIoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQ2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB0Yj1jLlVqfHx0YjsoZnVuY3Rpb24oYyl7Yy5Uaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9WigpO3RoaXMudWI9dGhpcy51Ynx8ITE7dGhpcy5HZT10aGlzLkplPXRoaXMuemY9dGhpcy5pYT10aGlzLm1lPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLApiKXt0aGlzLlhvKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5tZT0hMDt0aGlzLnpmJiZ0aGlzLlJlKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZmI7YSYmYS5ZYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy56Zj0hMDt0aGlzLlJlKCl9LmJpbmQodGhpcykpO3RoaXMuTmUoKX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy51Yil7dGhpcy50YygpO2lmKCF0aGlzLm1lJiYhdGhpcy50YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwKMTAwKSwhMDt0aGlzLm1lJiZ0aGlzLkdlJiYhdGhpcy5KZSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19LHRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxtZjpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxOZTpmdW5jdGlvbigpe2lmKHRoaXMudGMoKSl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkplPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuR2U9Yi53dX10aGlzLmhhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmUoKX0uYmluZCh0aGlzKSwxMDApfSxEdTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5RdSgpOiExfSxVYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuVWIoKTotMX0sb3A6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sWG86ZnVuY3Rpb24oYixhKXt0aGlzLnViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMudWJ8fDMwMj09dGhpcy51Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy51Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX0seGM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPyh0aGlzLm0oKSx0aGlzLm5hKCkpOmIuTmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciB1Yj1jLlRqfHx1YjsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGhxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLnJrLldsLlVsP3dpbmRvdy5PTy5yay5XbC5VbC51dShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ocSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPVooKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxmLkRhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB0YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgdWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIHZiPWMuVmp8fHZiLHdiPW5ldyB2YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcT10aGlzLmFbOF07dGhpcy5Ibj10aGlzLmFbNV07dGhpcy5DbT10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs3XX1jLlZpPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLkduKGEpfSwKR246ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5DbTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3U6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy5WaXx8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuTHEoNCk7KGZ1bmN0aW9uKGMpe2MuVWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5Va3x8eWI7KGZ1bmN0aW9uKGMpe2MuVGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp5LnFkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuYnIoYSl9LmJpbmQodGhpcykpO3kuQ3AoKX0sYnI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7CnRoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgemI9Yy5Ua3x8emI7KGZ1bmN0aW9uKGMpe2MuVms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuJG4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9CltdKTt0aGlzLlNjLnB1c2goYlthXSk7dmFyIGU9bmV3IHliKGQpO3RoaXMuSShlKXx8KHRoaXMuTChlKSwobmV3IHpiKGUsdGhpcy5BKSkuYigpKX1jYXRjaChoKXt9fX10aGlzLkgoKX0scWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuWnx8KHRoaXMuWj17fSk7dGhpcy5aW2JdfHwodGhpcy5aW2JdPXt9KTt0aGlzLlpbYl1bYV18fCh0aGlzLlpbYl1bYV09W10pO3RoaXMuWltiXVthXS5wdXNoKGMpfSxidDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMuWHIoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSwKQ3A6ZnVuY3Rpb24oKXtpZih0aGlzLiRiKWZvcih2YXIgYj0wO2I8dGhpcy4kYi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLiRiW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5aW2NdW2RdJiYwPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ0KGIpfX0pfSkoYyk7dmFyIEFiPWMuVmt8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaj0KdGhpcy5hWzNdO3RoaXMub3U9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5taD1iO2IucHJvdG90eXBlPXtFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm91OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgQmI9Yy5taHx8QmIsZWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRWooNCk7KGZ1bmN0aW9uKGMpe2MuZ2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0samI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLmdofHxDYjsoZnVuY3Rpb24oYyl7Yy5oaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkNyfHwodGhpcy5Dcj0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5oaHx8RGI7KGZ1bmN0aW9uKGMpe2MuaWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgQ2IoZCk7dGhpcy5JKGYpfHwodGhpcy5MKGYpLChuZXcgRGIoZix0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5IKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5paHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maj10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbMTBdO3RoaXMuYmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbM119Yy5Fbz1iO2IucHJvdG90eXBlPXtLajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTGo6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlpuOnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaDp0aGlzLmFqKGEpfSxhajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYj1jLkVvfHxHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC5Laig0KTsKKGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLnlsfHxIYjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy5ab3x8KHRoaXMuQWYoKSx0aGlzLlpvPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLkxlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5MZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLAo1MDApKX0sY3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jcCgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5vKCksdGhpcy5sKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZigpfS5iaW5kKHRoaXMpLDUwKX0sT3U6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBJYj1jLnhsfHxJYjsoZnVuY3Rpb24oYyl7Yy56bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5MKGMpLChuZXcgSWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEpiPWMuemx8fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy5RcD10aGlzLmFbN107dGhpcy5SbD10aGlzLmFbN107dGhpcy5VcD10aGlzLmFbMTBdOwp0aGlzLiRrPXRoaXMuYVs1XTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuVmc9YjtiLnByb3RvdHlwZT17Um06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNtOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcDp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmw6dGhpcy5UcChhKX0sVHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlVwOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kazp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLlZnfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9Z2QuUm0oNCk7KGZ1bmN0aW9uKGMpe2MuaGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYoMCx0aGlzLkopKCEwKX0uYmluZCh0aGlzKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTsKdmFyIE1iPWMuaGp8fE1iOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZ20oKX0uYmluZCh0aGlzKSksdGhpcy5KZz0hMSx0aGlzLlN0PQoxRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLlN0KSl9LGdtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTsKYltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy5nanx8TmI7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8CndpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpO3ZhciBPYj1jLmlqfHxPYixQYj1uZXcgT2IocSk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs5XTt0aGlzLmxxPXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVsxMF07dGhpcy5KaD10aGlzLmFbN107dGhpcy5PcD10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52aDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy54aChhKX0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnloOnRoaXMuSWgoYSl9LEloOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLlNxfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTmt8fFJiOyhmdW5jdGlvbihjKXtjLk1rPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLkdkKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLAoxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLk1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5Paz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmCiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIFRiPWMuT2t8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbMTBdO3RoaXMuSmk9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy4kcj1iO2IucHJvdG90eXBlPXtFaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmk6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkppOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5QbTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOgphfX19KShjKTt2YXIgVmI9Yy4kcnx8VmIsaWQ9bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aWQuRWkoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuV2Q9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkZyKCl9LmJpbmQodGhpcyksNTAwKX0sRnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJgpiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2QmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuV2QpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwKInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sSHM6ZnVuY3Rpb24oKXt0aGlzLldkPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgV2I9Yy5Fa3x8V2I7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLktiPTB9LGI6ZnVuY3Rpb24oKXt0aGlzLk5xPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMuS2J8fHRoaXMuS2IrKyx0aGlzLktiPD10aGlzLk5xPyh0aGlzLktiKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IcygpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgWGI9Yy5Ea3x8WGI7KGZ1bmN0aW9uKGMpe2MuRms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IFdiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFhiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgWWI9Yy5Ga3x8WWIsWmI9bmV3IFliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLkRpPXRoaXMuYVs5XTt0aGlzLlFzPXRoaXMuYVsxMF07dGhpcy4kaj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkJoPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nbjp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVGg6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOgp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgJGI9Yy5CaHx8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuZm4oNCk7KGZ1bmN0aW9uKGMpe2Muems9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5PKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlIoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLkooKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy56a3x8YWM7KGZ1bmN0aW9uKGMpe2MueWs9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkNhKCk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkljKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5CcSgpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxObjpmdW5jdGlvbigpe3RoaXMuRmUoKXx8dGhpcy5vKCEwKX0sQnE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5JYygpOyFiLm1hJiZiLmJhJiZiLnR1JiZiLnZ1JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkNhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10uaWQ9PQphKXJldHVybiBiW2NdO3JldHVybnt9fSxHZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxvOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5JYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLnlrfHxiYzsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSlmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IGJjKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBjYz1jLkFrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzFdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMud3E9dGhpcy5hWzldO3RoaXMubGg9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ibz1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR2g6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNrOnRoaXMuQ2goYSl9LENoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EaDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3E6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMuYm98fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWtkLkZoKDQpOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuTyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5SKGEpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sSzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQ2E6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmCih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVD1jLnJqfHxUOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlhkPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGQ9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5YZCYmYiE9dGhpcy5YZHx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKGsuYWRUYWc9YS5hZFVSTCksdGhpcy5sKCJhZGVycm9yIixhLlN1KSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVPWMucWp8fFU7KGZ1bmN0aW9uKGMpe2Muc2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEQpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgVChiKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgVShiLHRoaXMuQSksYi5iKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFQoYiksYi5qYT90aGlzLmNnKCk6dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBELGZjPWMuc2p8fGZjLGdjPW5ldyBmYyhmdW5jdGlvbihjLGIpe2MucGF1c2UoKTtpZihtLm5iLmxlbmd0aCl7dmFyIGE9bS5uYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9Zi5wcyh7IltMT0FEU0NSSVBUXSI6Zi5wYSgxMCksIltVVElMU10iOmYucGEoMTApLCJbQ0FMTEJBQ0tdIjpmLnBhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09Zi5NZi5iaW5kKGYpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKWtbZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWYuTWYoZywKZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obz10aGlzLmFbNV07dGhpcy5Fcz10aGlzLmFbOV07dGhpcy5tbz10aGlzLmFbMV07dGhpcy56aj10aGlzLmFbM107dGhpcy5pbz10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbOF07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbM107dGhpcy5maj10aGlzLmFbMl07dGhpcy5nPXRoaXMuYVsyXX1jLnRpPWI7Yi5wcm90b3R5cGU9e01vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Obzp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRXM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5tbzp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Jazp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBsOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhjPWMudGl8fGhjLGxkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLk1vKDQpOyhmdW5jdGlvbihjKXtjLmdsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuTyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlIoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlRxPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxnczpmdW5jdGlvbihiKXt0aGlzLm5kPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UcX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sSzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJih0aGlzLkomJnRoaXMuSigpLHRoaXMubmQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm5kJiYobmV3IEcodGhpcyx0aGlzLm5kKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuZ2x8fE07KGZ1bmN0aW9uKGMpe2MuZmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5BZClpZih0aGlzLmdifHwodGhpcy5nYj0wKSx0aGlzLmdiKyssMTU8dGhpcy5nYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHRoaXMucnMoKSwhMDt0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm8oKTp0aGlzLm8oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEc9Yy5mbHx8RzsoZnVuY3Rpb24oYyl7Yy5obD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy53YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYi5ncyh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgaWM9Yy5obHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm11PXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMudG89YjtiLnByb3RvdHlwZT17bHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm11OnRoaXMubW4oYSl9LG1uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMudG98fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5sdSg0KTsoZnVuY3Rpb24oYyl7Yy5vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5VZT0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5SKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSwKe2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3JuOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuVWU9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3JuOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5vanx8bGM7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sV3U6ZnVuY3Rpb24oKXt9LFJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWUobmV3IGZ1bmN0aW9uKCl7fSk7YS5xdT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5ScihhKTsKd2luZG93Lnl1PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLlFyfHwodGhpcy5Rcj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRkfHwodGhpcy5EZD0xKTtpZigyMDx0aGlzLkRkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5EZCsrOwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmCmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuVyghMCl9LmJpbmQodGhpcykpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMubmp8fG1jOyhmdW5jdGlvbihjKXtjLnBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgbmM9Yy5wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmpuPXRoaXMuYVs0XTt0aGlzLnRtPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzhdfWMuRWg9YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbjp0aGlzLnNtKGEpfSwKc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgcGM9Yy5FaHx8cGMsbmQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bmQuTW0oNCk7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKTthJiZ0aGlzLk8oYS5wYXJlbnROb2RlKX0sSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFY9Yy5sanx8VjsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy53Zj0wO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT10aGlzLlhiPXRoaXMuVmE9dGhpcy5xYz0hMTt0aGlzLmFnPWYua2IoMTApO3RoaXMuRmYoKX0sRmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm8oITApOnRoaXMubygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmYuYmluZCh0aGlzKSwxMDApLCExfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSwKdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBXPWMua2p8fFc7KGZ1bmN0aW9uKGMpe2MubWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFYod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7CmVsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBWKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIHFjPWMubWp8fHFjLHJjPW5ldyBxYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VZz10aGlzLmFbNF07dGhpcy5waD10aGlzLmFbNV07dGhpcy5sbD10aGlzLmFbMl07dGhpcy5Eaj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs1XX1jLmtpPWI7Yi5wcm90b3R5cGU9e1RnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VZzp0aGlzLm9oKGEpfSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucGg6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sbDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGo6dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVpOnRoaXMuUW8oYSl9LFFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Sbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMua2l8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLlRnKDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLk8oYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5RaHx8dGM7KGZ1bmN0aW9uKGMpe2MuUGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsCmZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5vKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5QaHx8dWM7KGZ1bmN0aW9uKGMpe2MuUmg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGYuRGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkkoZCl8fCh0aGlzLkwoZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkgoKX19KX0pKGMpO3ZhciB2Yz1jLlJofHx2Yyx3Yz1uZXcgdmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJsPXRoaXMuYVsxMF07dGhpcy54az10aGlzLmFbM107dGhpcy5XbT10aGlzLmFbM107dGhpcy5jbj10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbM107dGhpcy50bj10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLnZyPWI7Yi5wcm90b3R5cGU9e0FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CbDp0aGlzLndrKGEpfSx3azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGs6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldtOnRoaXMuYm4oYSl9LGJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jbjp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua2s6dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRuOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgeGM9Yy52cnx8eGMscGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuJGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLk8oYiksdGhpcy5SKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHljPWMuJGh8fHljOyhmdW5jdGlvbihjKXtjLlpoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlBlKCl9LFBlOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5aaHx8emM7KGZ1bmN0aW9uKGMpe2MuYWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5qYSl7dGhpcy5IKCk7cmV0dXJufWlmKCF0aGlzLkkoYikpe3RoaXMuTChiKTsobmV3IHpjKGIsdGhpcy5BKSkuYigpO3RoaXMuSCgpO3JldHVybn19dGhpcy5IKCl9fSl9KShjKTt2YXIgQWM9Yy5haXx8QWMsQmM9bmV3IEFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsyXTt0aGlzLkNzPXRoaXMuYVsxXTt0aGlzLnRrPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVsxMF07dGhpcy5laz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs5XX1jLmpxPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IaTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRrOnRoaXMuY3IoYSl9LGNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuZHI6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5qcXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGY9dGhpcy5LZj10aGlzLkpmPSExO3RoaXMuVWM9W107dGhpcy4kZD17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcmM/bnVsbDpyYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBGYj9udWxsOkZiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFViP251bGw6VWIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHdiPwpudWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB4YT9udWxsOnhhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE1hP251bGw6TWEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgbmE/bnVsbDpuYX19Yy5waz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnJwKGEpOltdLGI7dGhpcy5LZj0hMDtpZihhLmxlbmd0aCl7dGhpcy5KZj0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPQphW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxycDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZFtjXSx0aGlzLm9lKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEpe3RoaXMub2UoYSkmJmEuYigpfSxKczpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuSmYpZm9yKHRoaXMuSGY9ITAsYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXRoaXMuVWNbYV0ucWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5VY1thXS5xYil9fX0pKGMpO3ZhciBEYz1jLnBrfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Q9dGhpcy5hWzRdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMV19Yy53bD1iO2IucHJvdG90eXBlPXtWdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3Q6dGhpcy5pdShhKX0saXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmp1OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qbDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEVjPWMud2x8fEVjLHJkPW5ldyBFYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLlZ0KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZi5UYihsLnd0KSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5UYihsLldxKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxiYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRj1uZXcgZ2Esaz0hMTtGLk1jKCk7Ri5CZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuTWMoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkJmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5NYygpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2YuZmlyZUV2ZW50KHdpbmRvdyxGLlhwKCkse2lkOnRkfSl9LDUwMCk7YWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bz10aGlzLmFbMV07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMueXM9dGhpcy5hWzEwXTt0aGlzLkpqPXRoaXMuYVsyXTsKdGhpcy5vdD10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzEwXTt0aGlzLklvPXRoaXMuYVsxXTt0aGlzLm5sPXRoaXMuYVs0XTt0aGlzLmFwPXRoaXMuYVs0XTt0aGlzLmRqPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzZdfWMuTWo9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZvOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5mdTp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Kajp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3Q6dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJqOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6CnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hcDp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLk1qfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC51byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmY9dGhpcy5jb25mPXRoaXMuVWE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLlBjPTA7dGhpcy5MYT0iIjt0aGlzLlZjPVtdO3RoaXMuV2M9MDt0aGlzLiRmPSExO3RoaXMuWWQ9W119Yy5MZz1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXt0aGlzLlpmPWF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGpzOmZ1bmN0aW9uKGEpe3RoaXMuVWE9YX0saHM6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5MYV0mJnRoaXMuY29uZlt0aGlzLkxhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTGFdW2FdKTtyZXR1cm4gYn0sYmM6ZnVuY3Rpb24oYSxiKXtmLmliKCJ3ZWx0LmRlIikmJmYuWGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpOwp2YXIgYz0hMSxlPSExO2lmKHRoaXMuWXAoKSl0aGlzLlVhLmModGhpcy5VYS5KYyx0aGlzLlVhLnphLHRoaXMuVWEuWmQsZnVuY3Rpb24oKXt0aGlzLmJjKGEsYil9LmJpbmQodGhpcyksdGhpcy5VYS5CYyk7ZWxzZSBpZih0aGlzLkVwKCkpdGhpcy5jcyhmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YuRChsLnljLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkxzKCk7ay5leGl0RnVsbHNjcmVlbigpO1E9az1uZXcgTyhrLHRoaXMuVWEsaCk7ay5nZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5LcShhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpOwpoLmFkU3RhcnRUaW1lb3V0JiYoZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5KZChhLGMsZSk7dGhpcy5wbGF5ZXIuaGcoayl9fSxZcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlBjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuUGMuZ2V0VGltZSgpLHRoaXMuUGM9YSwzRTU8Yj8hMDohMTt0aGlzLlBjPWE7cmV0dXJuITF9LEFzOmZ1bmN0aW9uKCl7Zi5lZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmFmKGEpKT90aGlzLmJjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfSx6czpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLm9zKCEwKTsKdmFyIGI9dGhpcy5jb25mLGM9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5hZihjKSk/dGhpcy5iYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9fSxhZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sVHI6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50cyh0aGlzLnpzLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmVhKCl9LCRjOmZ1bmN0aW9uKGEpe2YuZWUoIm1pZHJvbGwiKTtpZighdGhpcy5PZil7dGhpcy5PZj0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuYmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2Y9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LFNyOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIubnModGhpcy4kYy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5BcygpO3RoaXMucGxheWVyLk5kJiZ0aGlzLlNyKCk7dGhpcy5UcigpfSxVcjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLlZjLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5rdShhLGIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlciwKYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLldjPXRoaXMuVmMubGVuZ3RofSxFcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5XYyYmKGE9ITApO3JldHVybiBhfSxjczpmdW5jdGlvbihhKXt0aGlzLiRmPWE7Zm9yKGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl0aGlzLlZjW2FdWyJmdW5jdGlvbiJdKHRoaXMuSXIuYmluZCh0aGlzKSl9LElyOmZ1bmN0aW9uKGEpe3RoaXMuV2MtLTthJiZ0aGlzLllkLnB1c2goYSk7MD49dGhpcy5XYyYmdGhpcy4kZigpfSxLcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5ZZC5sZW5ndGg7YysrKWI9dGhpcy5ZZFtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZGE9Yy5MZ3x8ZGEsUT0hMSxqYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaD10aGlzLmFbN107CnRoaXMuWGc9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMucG49YjtiLnByb3RvdHlwZT17emg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFoOnRoaXMuV2coYSl9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdjPWMucG58fEdjLHZkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnpoKDQpfSkuY2FsbChWb3B1V3VpdlhhaExpb1llLFZvcHVXdWl2WGFoTGlvWWUpOwo=
Protocol
HTTP/1.1
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

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
User-Agent
Mozilla/5.0 (Macintosh; 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, 11 Jul 2018 20:06:01 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
/
ssl.1.damoh.chip.de/942318767f468c65bf80ae72ce8bca3cd6609951/
109 B
669 B
XHR
General
Full URL
https://ssl.1.damoh.chip.de/942318767f468c65bf80ae72ce8bca3cd6609951/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFZvcHVXdWl2WGFoTGlvWWU9Vm9wdVd1aXZYYWhMaW9ZZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWGEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLmpzKG0pLGEuaHMoayksYS5VcigpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuT2o9dGhpcy5hWzFdO3RoaXMuUmc9dGhpcy5hWzZdO3RoaXMuUGk9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbNF19Yy5OZz0KYjtiLnByb3RvdHlwZT17Tmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9qOnRoaXMuUWcoYSl9LFFnOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5SZzp0aGlzLk9pKGEpfSxPaTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYT1jLk5nfHxlYSxIYz1uZXcgZWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1IYy5Oaig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5FYT0ic2V0dXAiO3RoaXMuZGM9W107dGhpcy5TZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLkhyLmJpbmQodGhpcykpfWMubmk9YjtiLnByb3RvdHlwZT17U2U6ZnVuY3Rpb24oKXt0aGlzLmxhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSwKb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LG9tOmZ1bmN0aW9uKGEpe3RoaXMubGEuZXJybXNnLnB1c2goYSl9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGEsYil7dHJ5e2EuY29udGVudFdpbmRvdyYmKGE9YS5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YS5wb3N0TWVzc2FnZShiLCIqIil9LEdhOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnBvc3RNZXNzYWdlKGEse3R5cGU6InZwYWlkIixldmVudDpiLGRhdGE6ZH0pfSxIcjpmdW5jdGlvbihhKXthJiZhLmRhdGEmJmEuZGF0YS50eXBlJiYidnBhaWQiPT1hLmRhdGEudHlwZSYmdGhpcy5HcihhLmRhdGEpfSxHcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMubGEuZXZlbnRsaXN0ZW5lci5sZW5ndGg7YisrKWEuZXZlbnQ9PQp0aGlzLmxhLmV2ZW50bGlzdGVuZXJbYl0ubmFtZSYmdGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLmNiKGEpfSxyZDpmdW5jdGlvbihhLGIpe3RoaXMubGEuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmEsY2I6Yn0pfSxtbTpmdW5jdGlvbihhLGIpezA9PT1iLmluZGV4T2YoIi8vIikmJihiPSJodHRwczoiK2IpO3RoaXMubGEudXJsc1thXT1iO3RoaXMubGEudXJsc1tiXT1hO3RoaXMubGEuaG9tYWRVcmxzW2FdPWI7dGhpcy5sYS5vcmlnaW5hbFVybHNbYl09YX0sYmY6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5sYS5vcmlnaW5hbFVybHNbYV0mJihiPXRoaXMubGEub3JpZ2luYWxVcmxzW2FdKTtyZXR1cm4gYn0sWmE6ZnVuY3Rpb24oYSxiKXtifHwoYj0iIik7Zm9yKHZhciBkPTA7ZDx0aGlzLmxhLmVycm1zZy5sZW5ndGg7ZCsrKWIrPSJcbiIrdGhpcy5sYS5lcnJtc2dbZF07dGhpcy50cmFjaygic3RhdHNfdnBhaWRfIithLGIsITApfSxEYTpmdW5jdGlvbihhKXtpZighYXx8Im9iamVjdCIhPT0KdHlwZW9mIGEpcmV0dXJuIDA7dmFyIGI9MCxkPSIiO2ZvcihkIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShkKSYmYisrO3JldHVybiBifSxoZjpmdW5jdGlvbihhLGIpe3ZhciBkPWFbYl07cmV0dXJuInN0cmluZyI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKToiZnVuY3Rpb24iPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCgpKToib2JqZWN0Ij09PXR5cGVvZiBkP2Q6bnVsbH0sSXM6ZnVuY3Rpb24oYSl7Zm9yKDthIT1kb2N1bWVudC5ib2R5JiZudWxsIT1hOylhPWEucGFyZW50RWxlbWVudDtyZXR1cm4gYT09ZG9jdW1lbnQuYm9keT8hMDohMX0sRGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYiZnVuY3Rpb24iPT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0PyhhPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpPzA8PWEudG9wJiYwPD1hLmxlZnQmJmEuYm90dG9tPD0od2luZG93LmlubmVySGVpZ2h0fHwKZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmEucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKTohMTohMX0sRWY6ZnVuY3Rpb24oYSxiKXt2YXIgZD0wLGU9MCxjPTAsaD0wLGY9ITE7aWYoIWF8fCFhLmdldEJvdW5kaW5nQ2xpZW50UmVjdHx8ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4hMTt2YXIgdT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKCF1KXJldHVybiExO2M9dS5oZWlnaHQqdS53aWR0aDtkPXUud2lkdGg7ZT11LmhlaWdodDswPnUudG9wJiYoZSs9dS50b3ApO3UuYm90dG9tPih3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiYoZS09dS5ib3R0b20tKHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkpOzA+dS5sZWZ0JiYKKGQrPXUubGVmdCk7dS5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT11LnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSk7MD5lJiYoZT0wKTswPmQmJihkPTApOzA8YyYmKGg9MTAwL2MqZCplKTtoPj1iJiYoZj0hMCk7cmV0dXJuIGZ9LGtiOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYT9NYXRoLmFicyhhKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LHBhOmZ1bmN0aW9uKGEpe2E9YSYmIm51bWJlciI9PT10eXBlb2YgYSYmMDxhP01hdGgucm91bmQoYSk6MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBifSwKQmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGU7aWYoMD09PWEubGVuZ3RoKXJldHVybiBiO2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZT1hLmNoYXJDb2RlQXQoZCksYj0oYjw8NSktYitlLGJ8PTA7cmV0dXJuIGJ9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGc9IiIsZCxlO2ZvcihkPTc7MDw9ZDtkLS0pZT1hPj4+NCpkJjE1LGcrPWUudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxjLGg9QXJyYXkoODApLGY9MTczMjU4NDE5Myx1PTQwMjMyMzM0MTcsaz0yNTYyMzgzMTAyLEk9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdyxxLHI7YT1hJiYic3RyaW5nIj09PXR5cGVvZiBhP2E6IiI7bj1hLmxlbmd0aDt2YXIgcD1bXTtmb3IoZT0wO2U8bi0zO2UrPTQpYz1hLmNoYXJDb2RlQXQoZSk8PDI0fGEuY2hhckNvZGVBdChlKzEpPDwxNnxhLmNoYXJDb2RlQXQoZSsyKTw8OHxhLmNoYXJDb2RlQXQoZSszKSwKcC5wdXNoKGMpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocC5wdXNoKGUpOzE0IT1wLmxlbmd0aCUxNjspcC5wdXNoKDApO3AucHVzaChuPj4+MjkpO3AucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTxwLmxlbmd0aDthKz0xNil7Zm9yKGU9MDsxNj5lO2UrKyloW2VdPXBbYStlXTtmb3IoZT0xNjs3OT49ZTtlKyspaFtlXT1kKGhbZS0zXV5oW2UtOF1eaFtlLTE0XV5oW2UtMTZdLDEpO2M9ZjtuPXU7bD1rO3c9STtxPW07Zm9yKGU9MDsxOT49ZTtlKyspcj1kKGMsNSkrKG4mbHx+biZ3KStxK2hbZV0rMTUxODUwMDI0OSYKNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTIwOzM5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT00MDs1OT49ZTtlKyspcj1kKGMsNSkrKG4mbHxuJnd8bCZ3KStxK2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXI9ZChjLDUpKyhuXmxedykrcStoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2Y9ZitjJjQyOTQ5NjcyOTU7dT11K24mNDI5NDk2NzI5NTtrPWsrbCY0Mjk0OTY3Mjk1O0k9SSt3JjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NX1yZXR1cm4oYihmKStiKHUpK2IoaykrYihJKStiKG0pKS50b0xvd2VyQ2FzZSgpfSx3YjpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZCxlLGMsaCxmLHUsaz0wO2s8YS5sZW5ndGg7KWQ9CmEuY2hhckNvZGVBdChrKyspLGU9YS5jaGFyQ29kZUF0KGsrKyksYz1hLmNoYXJDb2RlQXQoaysrKSxoPWQ+PjIsZD0oZCYzKTw8NHxlPj40LGY9KGUmMTUpPDwyfGM+PjYsdT1jJjYzLGlzTmFOKGUpP2Y9dT02NDppc05hTihjKSYmKHU9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChmKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdCh1KTtyZXR1cm4gYn0sZ3E6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmCi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPSExLGQ9ITEsZT0hMSxjPSExLGg9ITEsZj0hMSx1PSExLGs9ITEsbD0hMSxtPSExO3RyeXtiPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocSl7fXRyeXtlPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLiRtPyEwOiExfWNhdGNoKHIpe310cnl7Yz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLGY9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIiksdT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIiksbD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKSwKaz0hdSYmISF3aW5kb3cuU3R5bGVNZWRpYSxtPShsfHxjKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1lO2EuaXNPcGVyYT1jO2EuaXNGaXJlZm94PWg7YS5pc1NhZmFyaT1mO2EuaXNJRT11O2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxlcDpmdW5jdGlvbigpe3ZhciBhPSJVIixiPXRoaXMuV2UoKTtiLmlzUGhhbnRvbUpTP2E9IkhQIjpiLmlzQ2hyb21lSGVhZGxlc3M/YT0iSEMiOmIuaXNGaXJlZm94SGVhZGxlc3M/YT0iSEYiOihiLmlzQmxpbmsmJihhPSJCIiksYi5pc09wZXJhJiYoYT0iTyIpLGIuaXNGaXJlZm94JiYoYT0iRiIpLGIuaXNTYWZhcmkmJihhPSJTIiksYi5pc0lFJiYoYT0iSSIpLGIuaXNFZGdlJiYoYT0iRSIpLGIuaXNDaHJvbWUmJihhPSJDIikpO3JldHVybiBhfSxXYTpmdW5jdGlvbigpe3ZhciBhPXtZZzpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSwKamg6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sR3A6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sWWo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFltOmZ1bmN0aW9uKCl7cmV0dXJuIGEuWWcoKXx8YS5qaCgpfHxhLkdwKCl8fGEuWWooKXx8YS5DbCgpfX07cmV0dXJuIGEuWW0oKX0sS2E6ZnVuY3Rpb24oYSl7dmFyIGI9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpOwpmb3IodmFyIGQ9e30sZT0xNDtlLS07KWRbYltlXV09YVtlXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihhLGIsZyl7YiYmKGQucXVlcnlLZXlbYl09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj17fSxkPVtdLGU9MCxjPWEubGVuZ3RoO2U8YzsrK2UpYi5oYXNPd25Qcm9wZXJ0eShhW2VdKXx8KGQucHVzaChhW2VdKSxiW2FbZV1dPTEpO3JldHVybiBkfSxvZjpmdW5jdGlvbihhKXthPXRoaXMuS2EoYSkuaG9zdC5zcGxpdCgiLiIpO3ZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSxpYjpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CmImJi0xPGIuaW5kZXhPZihhKSYmKGQ9ITApO3JldHVybiBkfSwkbjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxlPVtdLGM9MDtjPGIubGVuZ3RoO2MrKylkW2JbY11dPSEwO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspZFthW2NdXXx8ZS5wdXNoKGFbY10pO3JldHVybiBlfSxGczpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGU9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZT1hLnNwbGl0KCIlIiksZD1iLzEwMCplKTooZD1hLnNwbGl0KCI6IiksZD0zNjAwKitkWzBdKzYwKitkWzFdKyArZFsyXSxkPU1hdGgucm91bmQoZCkpfWNhdGNoKGMpe2Q9LTF9cmV0dXJuIGlzTmFOKGQpPy0xOmR9LGVmOmZ1bmN0aW9uKGEpe2E9TWF0aC5yb3VuZChhKTt2YXIgYj0iLS06LS0iOzA8PWEmJihhPU1hdGguZmxvb3IoYSksYj1NYXRoLmZsb29yKGEvNjApLGI9dGhpcy54ZyhiKSsiOiIrdGhpcy54ZyhNYXRoLmZsb29yKGEtNjAqYikpKTtyZXR1cm4gYn0seGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPgphPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxlZTpmdW5jdGlvbihhKXt0aGlzLkVhPWF9LGZpcmVFdmVudDpmdW5jdGlvbihhLGIsZCl7dmFyIGU7ZC5zdGF0ZT10aGlzLkVhOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2U9bmV3IEN1c3RvbUV2ZW50KGIse2RldGFpbDpkfSk6KGU9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksZS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkKSk7YS5kaXNwYXRjaEV2ZW50KGUpfSxUYjpmdW5jdGlvbihhLGIsZCl7Ynx8KGI9ImhkRXZlbnQiKTtkfHwoZD13aW5kb3cpO3RoaXMuZmlyZUV2ZW50KGQsYixhKX0sRDpmdW5jdGlvbihhLGIsZCxlLGMpe3ZhciBoPWE7ZCYmYiYmKGI9bC5GYyhiLGQpKTtiJiYoaD1sLkZjKGEsYikpO2UmJihoPWwuRmMoaCxlKSk7YyYmKGg9bC5GYyhoLGMpKTtmLlRiKGgpfSx0cmFjazpmdW5jdGlvbihhLGIsZCl7aWYoZClpZighbXx8IW0uWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudHJhY2soYSwKYixkKX0uYmluZCh0aGlzKSw1MDApO2Vsc2UgaWYobS5pc0VuYWJsZWQpe3ZhciBlPW0uYWUoKSsiP2hvbWFkX3RyYWNrX2tleT0iK2VuY29kZVVSSUNvbXBvbmVudChhKSsiJmhvbWFkX3RyYWNrX3ZhbHVlPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpO20uVGEoZSwhMCk7ZT1tLlRhKGUsITApO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSIiO2UuZGF0YS5ob21hZF90cmFja19rZXk9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7ZS5kYXRhLmhvbWFkX3RyYWNrX3ZhbHVlPSIqIitlbmNvZGVVUklDb21wb25lbnQoYikrIioiO20uRmEoZSxmdW5jdGlvbihkKXt2YXIgZT0hMTtkPWQucmVzcG9uc2VUZXh0O3RyeXtkPUpTT04ucGFyc2UoZCksZD1kLmRhdGEsZFswXT09ZW5jb2RlVVJJQ29tcG9uZW50KGEpJiYoZT0hMCksZFsxXSYmZFsxXSE9ZW5jb2RlVVJJQ29tcG9uZW50KGIpJiYoZT0hMSl9Y2F0Y2goYyl7fWV8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLAooZFswXT9kWzBdOiIiKSsoZFsxXT9kWzFdOiIiKSwhMCl9LmJpbmQodGhpcykpfX0sS2Q6ZnVuY3Rpb24oKXttJiZtLlk/bS5pc0VuYWJsZWQmJm0ueG4oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2QoKX0uYmluZCh0aGlzKSw1MDApfSxxbjpmdW5jdGlvbihhLGIpe2lmKGIuT2MoYSl8fCJhYm91dDpibGFuayI9PWF8fDA8PWEuaW5kZXhPZigiZGF0YTppbWFnZSIpKXJldHVybiBhO3dpbmRvdy5zYW5kYm94JiZzYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXSYmKDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoImVycm9yIil8fDA8PXNhbmRib3guZWdbIlN0cmluZy5wcm90b3R5cGUuaW5kZXhPZiJdLmJpbmQoYSkoIkVycm9yIikpJiZ0aGlzLlphKCJlcnJfdXJsIixhKTtpZih0aGlzLmJmKGEpKXJldHVybiB0aGlzLmJmKGEpO3ZhciBkPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2QuaG9tYWRfdXJsX3N1ZmZpeD0KYTtkLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2IoYSk7ZC5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2QuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt2YXIgZT0hMSxjPSExLGM9dGhpcy5YYShhLGIudWEsZCxmdW5jdGlvbihhKXtlPWEucmVzcG9uc2VUZXh0fSxmdW5jdGlvbigpe30sYiwhMCk7dHJ5e2V8fChlPWMpLGU9SlNPTi5wYXJzZShlKX1jYXRjaChoKXtlPSExfWUudXJsJiZlLmhhc2gmJihlPWIuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMubW0oZSxhKTtyZXR1cm4gZX0sWGE6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZix1KXt2YXIgaz1ofHxtO2g9ITA7dSYmKGg9ITEpO2lmKGsmJmsuWSlpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e2E9YSgpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBhKWMoKTtlbHNle2suVGEoYSxoKTtoPWsuVGEoYSxoKTtoLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0KYjtoLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmb3IodmFyIHEgaW4gZCloLmRhdGFbcV09ZFtxXTtyZXR1cm4gay5GYShoLGUsYywiIiwiIixmKX19ZWxzZSBjKCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGEoYSxiLGQsZSxjLGssZix1KX0uYmluZCh0aGlzKSw1MDApfSxGcTpmdW5jdGlvbihhLGIsZCxlLGMsaCxmKXt2YXIgdT0hMDtmJiYodT0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtmPWQ7ZD0iIjtmb3IodmFyIGsgaW4gZilkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGZba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWV8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZShsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYiwKYSx1KSxsLndpdGhDcmVkZW50aWFscz1oLDA8ZC5sZW5ndGgmJmwuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksbC5zZW5kKGQpfWNhdGNoKG0pe2MmJmMoKX1yZXR1cm4gbH0sR3E6ZnVuY3Rpb24oYSxiLGQpe3RoaXMuRnEoYSwiR0VUIiwiIixmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O2lmKHRoaXMuZGMpZm9yKHZhciBjIGluIHRoaXMuZGMpYT1hLnNwbGl0KGMpLmpvaW4odGhpcy5kY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2Yud2IoYSk7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7CmImJnNldFRpbWVvdXQoYiwwKX0uYmluZCh0aGlzKSxkKX0sTWY6ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGM9e2hvbWFkX3VybF9wcmVmaXhfYWxpYXM6InZwYWlkIn07Yy5ob21hZF91cmxfc3VmZml4PWE7Yy5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2MuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtjLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dGhpcy5YYShhLGUudWEsYyxmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3RyeXthPUpTT04ucGFyc2UoYSl9Y2F0Y2goYyl7YT0hMX10aGlzLkdxKGUuTGMoKS5yZXBsYWNlKCJbaGFzaF0iLGEuaGFzaCksYixkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZSwhMCl9LHBzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRjPWF9LGt1OmZ1bmN0aW9uKGEsYixkLGUsYyl7dGhpcy5YYShhLGQse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO2RbMF0mJgooZD1kWzBdKTtkP2QuaWQ/KGI9Yi5yZXBsYWNlKCJbaWRdIixkLmlkKSxiPWIucmVwbGFjZSgiW3ByaWNlXSIsZC5wcmljZSksYj1iLnJlcGxhY2UoIlthZHZlcnRpc2VyXSIsZC5hZHZlcnRpc2VyKSxiPWIucmVwbGFjZSgiW2N1cmxdIixkLmN1cmwpLGI9Yi5yZXBsYWNlKCJbZm9ybWF0XSIsZC5mb3JtYXQpLGI9Yi5yZXBsYWNlKCJbc3JjXSIsZC5zcmMpLGI9Yi5yZXBsYWNlKCJbcHJpY2VyYW5nZV0iLGQucHJpY2VyYW5nZSksYj1iLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYj1iLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxiPWIucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjpiLG1hY3JvOmV9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX1jYXRjaChoKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KX0pfSxabTpmdW5jdGlvbihhKXtmb3IodmFyIGI9CiExOyFiOyl7dmFyIGQ9YS5sYXN0SW5kZXhPZigiRU5DT0RFKCIpOzA+ZD9iPSEwOihkPWEuc3Vic3RyaW5nKGQrNyxhLmluZGV4T2YoIikiLGQpKSxhPWEucmVwbGFjZSgiRU5DT0RFKCIrZCsiKSIsZW5jb2RlVVJJQ29tcG9uZW50KGQpKSl9cmV0dXJuIGF9LGJxOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ITE7aWYoYilmb3IodmFyIGU9MDtlPGIubGVuZ3RoO2UrKylpZihiW2VdPT1hKXtkPSEwO2JyZWFrfXJldHVybiBkfX19KShjKTt2YXIgUD1jLm5pfHxQO25ldyBQO3ZhciBmPW5ldyBQO3dpbmRvdy5CdT1mOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEpe3RoaXMuZGF0YT1hfHx7fX1jLm1pPWI7Yi5GYz1mdW5jdGlvbihhLGIpe3ZhciBkPXt9LGU7Zm9yKGUgaW4gYilkW2VdPWJbZV07Zm9yKGUgaW4gYSlkW2VdPWFbZV07cmV0dXJuIGR9O2IudXI9e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2IuVnE9e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlJ0PXtjb2RlOiIxMDAyIix0eXBlOiJ2cGFpZCIsbWVzc2FnZToiIixuYW1lOiJ2cGFpZCJ9O2IuSm89e2NvZGU6IjEwMDMiLHR5cGU6ImVtcHR5VmFzdCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdT17Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLmZtPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTtiLiRsPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07Yi5jbT17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07Yi5obT17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2IuWmw9e2NvZGU6IjEwMDkiLAp0eXBlOiJhZENvbXBsZXRlIixtZXNzYWdlOiIiLG5hbWU6ImFkQ29tcGxldGUifTtiLmFtPXtjb2RlOiIxMDEwIix0eXBlOiJhZEltcHJlc3Npb25zQ2FsbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkSW1wcmVzc2lvbiJ9O2IuenQ9e2NvZGU6IjEwMTEiLHR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlVxPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLktvPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5hdT17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Mbj17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTtiLlFuPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLAptZXNzYWdlOiIiLG5hbWU6ImNvbnRpbnVlQ29udGVudCJ9O2IuemM9e2NvZGU6IjEwMTciLHR5cGU6ImNvbnRlbnRQbGF5ZXJQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQbGF5In07Yi55Yz17Y29kZToiMTAxOCIsdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2IuZW09e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTtiLmRtPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07Yi5JZT17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2IuSGU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2IuaW09e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTsKYi5ibT17Y29kZToiMTAyNCIsdHlwZToiYWRNZXRhIixtZXNzYWdlOiIiLG5hbWU6ImFkTWV0YSJ9O2Iud3Q9e2NvZGU6IjkwMDEiLHR5cGU6InZhcmlhYmxlRGVsZXRlZEV2ZW50IixtZXNzYWdlOiIiLG5hbWU6InZhcmlhYmxlRGVsZXRlZEV2ZW50In07Yi5XcT17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07Yi5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sZ2V0VHlwZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnR5cGV9fX0pKGMpO3ZhciBsPWMubWl8fGw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHI9dGhpcy5hWzVdO3RoaXMuQXE9dGhpcy5hWzRdO3RoaXMuS249dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19CmMudXE9YjtiLnByb3RvdHlwZT17b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnByOnRoaXMuenEoYSl9LHpxOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5BcTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgZmE9Yy51cXx8ZmEsSmM9bmV3IGZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SmMub3IoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5vaT1iO2IucHJvdG90eXBlPXtCZDpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZSxjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBNYXRoLmFicyhiKX0sCmViOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrbmF2aWdhdG9yLnBsYXRmb3JtKyhuYXZpZ2F0b3IubGFuZ3VhZ2V8fG5hdmlnYXRvci52fHwieCIpfSxtcDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxHYzpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTsKaWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD1hLmxlbmd0aC0xLGI9IiI7MDw9ZDtiKz1hW2QtLV0pO3JldHVybiBifSxNYzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLkJkKHRoaXMuZWIoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5HYyhhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYygpKyIyIn0sQmY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLm1wKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09CmIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5vaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueHI9dGhpcy5hWzhdO3RoaXMuQnQ9dGhpcy5hWzJdO3RoaXMuS2s9dGhpcy5hWzRdO3RoaXMudm09dGhpcy5hWzddO3RoaXMuYnM9dGhpcy5hWzVdO3RoaXMuZHQ9dGhpcy5hWzddO3RoaXMubnE9dGhpcy5hWzVdO3RoaXMuQmk9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbN119Yy5VaD1iO2IucHJvdG90eXBlPXt3cjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueHI6dGhpcy5BdChhKX0sQXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJ0OnRoaXMuSmsoYSl9LEprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Lazp0aGlzLnVtKGEpfSx1bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudm06dGhpcy5hcyhhKX0sYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5iczp0aGlzLmN0KGEpfSxjdDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZHQ6dGhpcy5tcShhKX0sbXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm5xOnRoaXMuQWkoYSl9LEFpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhhPWMuVWh8fGhhLEtjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUtjLndyKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGcpe3ZhciBkPXRoaXMucHJvdG90eXBlLGU9T2JqZWN0LmNyZWF0ZShkKSxjO2ZvcihjIGluIGcpZVtjXT0iZnVuY3Rpb24iPT09CnR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGdbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5pO3RoaXMuaT1kW2FdO3ZhciBlPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaT1nO3JldHVybiBlfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBlLmM/ZS5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2UuYzpmdW5jdGlvbigpe2QuYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtnLnByb3RvdHlwZT1lO2UuY29uc3RydWN0b3I9ZztnLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gZ307Yy51ZT1ifSkoYyk7dmFyIEo9Yy51ZXx8SjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbOF07dGhpcy54aT10aGlzLmFbOF07dGhpcy5ycj10aGlzLmFbNl07dGhpcy5odD0KdGhpcy5hWzNdO3RoaXMuVG89dGhpcy5hWzEwXTt0aGlzLllxPXRoaXMuYVs2XTt0aGlzLk1yPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzFdfWMuR3M9YjtiLnByb3RvdHlwZT17TWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk5pOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMueGk6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnJyOnRoaXMuZ3QoYSl9LGd0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5odDp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuVG86dGhpcy5YcShhKX0sWHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTXI6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLkdzfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuTWkoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5vaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5rcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGtzOmZ1bmN0aW9uKGIpe3RoaXMuQT0KYn0sbHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BfSxMOmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5lYigpXT1iO0smJksuS2YmJksuSnMoYil9LEp1OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmViKCldPyEwOiExfSxmcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LFh1OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMub2t8fHI7KGZ1bmN0aW9uKGMpe2MucWs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9Cm51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1iO3RoaXMuZmI9IiI7dGhpcy5ZZT0hMTt0aGlzLk4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSx0czpmdW5jdGlvbihiKXt0aGlzLko9Yn0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxuczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LEl1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LAppc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxZdTpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5GcCgpfHx0aGlzLmptKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LEx1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LGptOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEZwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPwohMDohMX0sTzpmdW5jdGlvbihiKXt0aGlzLmNvbnRhaW5lcj1ifSxDYTpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sUnU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxoYjpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmZiPQpifSxIdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZifSxXcjpmdW5jdGlvbigpe3RoaXMuZmI9bnVsbH0sTnU6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLmZiJiYoYj0hMCk7cmV0dXJuIGJ9LFR1OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxFdTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5xa3x8cDsoZnVuY3Rpb24oYyl7Yy5NZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLlZsPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LAp1bmtub3duOjZ9O3RoaXMuS2U9dGhpcy5CZz0hMTt0aGlzLnN0YXR1cz10aGlzLmljO3RoaXMuaWQ9Zi5wYSgxMCk7dGhpcy5ZYyhiKTt0aGlzLmxzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLnFzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsCmE9W107dGhpcy50YiYmMDx0aGlzLnRiLmxlbmd0aCYmKHRoaXMudGI9Zi51bmlxdWUodGhpcy50YiksZi50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0sTXU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LHFzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9CnRoaXMuRWV9LHJzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5WbH0sQ2I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sc3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGxzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxscDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEpxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5NZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Hbz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs4XX1jLlNnPWI7Yi5wcm90b3R5cGU9CntGbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlNnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5Gbyg0KTsoZnVuY3Rpb24oYyl7Yy5yaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmNvbnRlbnRFbCgpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LApwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLnJofHxSOyhmdW5jdGlvbihjKXtjLnFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuR3Q9MUUzO3RoaXMuV2Y9bnVsbDt0aGlzLml0PTJFM30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYod2luZG93LmRlbW9QbGF5ZXImJndpbmRvdy4kbSliLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLm9uKCJkaXNhYmxlIix0aGlzLllvLmJpbmQodGhpcykpO2Iub24oImFkdGltZW91dCIsdGhpcy5CcC5iaW5kKHRoaXMpKTtiLm9uKCJhZHN0YXJ0IixmdW5jdGlvbihhKXt0aGlzLkFwKGEsCmIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMuSnQoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLkt0KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMuenAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sT246ZnVuY3Rpb24oYil7ImFkc2Vycm9yIj09Yi50cmlnZ2VyZXZlbnQmJnRoaXMudygpfSxKdDpmdW5jdGlvbihiKXt0aGlzLmdkfHwodGhpcy5nZD13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTHQoYil9LmJpbmQodGhpcyksdGhpcy5HdCkpfSxMdDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCk7dGhpcy53KCl9LEt0OmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLmdkKX0sCnpwOmZ1bmN0aW9uKGIpe3RoaXMuenUoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuRHI8dGhpcy5pdD90aGlzLncoKTp0aGlzLm0oKX0sQnA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxZbzpmdW5jdGlvbigpe30sQXA6ZnVuY3Rpb24oKXt0aGlzLkRyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMucWh8fGxhOyhmdW5jdGlvbihjKXtjLnNoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5kZW1vUGxheWVyKXtpZih3aW5kb3cudmlkZW9qcyYmdmlkZW9qcy5wbGF5ZXJzJiYwPGYuRGEodmlkZW9qcy5wbGF5ZXJzKSl7dmFyIGI9dmlkZW9qcy5wbGF5ZXJzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1uZXcgUihiW2FdKTt0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyBsYShnLAp0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5zaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNrPXRoaXMuYVs3XTt0aGlzLkptPXRoaXMuYVs0XTt0aGlzLnJtPXRoaXMuYVs4XTt0aGlzLlVtPXRoaXMuYVs4XTt0aGlzLlNzPXRoaXMuYVsxXTt0aGlzLkRuPXRoaXMuYVs0XTt0aGlzLll0PXRoaXMuYVs1XTt0aGlzLnJsPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuSW49YjtiLnByb3RvdHlwZT17Ums6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlNrOnRoaXMuSW0oYSl9LEltOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5KbTp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMucm06dGhpcy5UbShhKX0sVG06ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlVtOnRoaXMuUnMoYSl9LApSczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU3M6dGhpcy5DbihhKX0sQ246ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRuOnRoaXMuWHQoYSl9LFh0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ZdDp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5Jbnx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMuUmsoNCk7KGZ1bmN0aW9uKGMpe2MuWmk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT0KYi5ub2RlTmFtZSliPWIucGFyZW50Tm9kZTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSx0aGlzLmVxPSEwKTt0aGlzLlIoYSk7dGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmVxKXt0aGlzLmNxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksCjUwKX19LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoay5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy4kYyhhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT0KYi5nZXRTdGF0ZSgpKXJldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7cmV0dXJuIGIuZ2V0U3RhdGUmJiJwYXVzZWQiPT1iLmdldFN0YXRlKCk/InBhdXNlZCI6dGhpcy5wbGF5ZXIucGF1c2UoITApfSxqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxoYjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7CnZhciBwYT1jLlppfHxwYTsoZnVuY3Rpb24oYyl7Yy5ZaT10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxOOmZ1bmN0aW9uKCl7fSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmFiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsCnRoaXMuYWI9ITApOihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLmFiPSEwKSxhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmFiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5hYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEltcHJlc3Npb24mJmIuX2V2ZW50cy5hZEltcHJlc3Npb24ucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZEltcHJlc3Npb24iKTt0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRFcnJvciYmYi5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYWI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJgoodGhpcy5DYigpLHRoaXMuZ2V0UGxheWVyKCkuUG49ITAsay5za2lwQWRPbkNvbnRleHRDaGFuZ2UpKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmZiO2EmJihhLlRkKCksYS5BYSgpKX19LmJpbmQodGhpcyl9KTtpZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTsKaWYoYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLlBmJiYhdGhpcy5oYSgpJiYodGhpcy5hYj8odGhpcy5sKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToKKHRoaXMubCgiYWRlcnJvciIsYi5jb2RlKSx0aGlzLm1jLmxlbmd0aD49dGhpcy5wZCYmdGhpcy5vKCkpfSxKcTpmdW5jdGlvbihiKXt0aGlzLmkoIkpXOiAiK2IudHlwZSl9LG86ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtmLklzKGEudmlkZW9UYWcpJiYoYS5jcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLllpfHxxYTsoZnVuY3Rpb24oYyl7Yy4kaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmlwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT0KYi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYKIlZJREVPIiE9Zy5ub2RlTmFtZXx8KGQ9Zyk7aWYoZCl7dmFyIGc9bmV3IHBhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5JKGcpfHx0aGlzLmZxKGcpfHwodGhpcy5MKGcpLGc9bmV3IHFhKGcsdGhpcy5BKSxnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LEd1OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGlwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy4kaXx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm1rPXRoaXMuYVsxXTt0aGlzLnppPXRoaXMuYVs5XTt0aGlzLlNwPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy5IcD1iO2IucHJvdG90eXBlPQp7bGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy56aTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuU3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB0YT1jLkhwfHx0YSxPYz1uZXcgdGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1PYy5sayg0KTsoZnVuY3Rpb24oYyl7Yy5HbD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvX2lkKTt0aGlzLk8oYik7dmFyIGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSxhPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmImJmEuY29udHJvbHMmJmEuY29udHJvbHMucGxheWVyJiZhLmNvbnRyb2xzLnBsYXllci5wYXVzZT90aGlzLlIoYik6dGhpcy5IKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLmlzUGxheWluZygpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlhPWkNPTSJ9fSl9KShjKTt2YXIgdWE9Yy5HbHx8dWE7KGZ1bmN0aW9uKGMpe2MuRmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi50cmFja2VyLnZhc3RfcHJlcm9sbHx8Yi50cmFja2VyLnZhc3RfcG9zdHJvbGw/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLm8oKSl9LG86ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7Yj10aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpfWNhdGNoKGEpe31iP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHZhPWMuRmx8fHZhOyhmdW5jdGlvbihjKXtjLkhsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5jb20mJndpbmRvdy5jb20ueG96JiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllciYmd2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzJiYwPGYuRGEod2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzKSl7dmFyIGI9d2luZG93LmNvbS54b3oudmlkZW9wbGF5ZXIuaW5zdGFuY2VzLGE7Zm9yKGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgZz1iW2FdO2lmKGcuY29udHJvbHMmJmcuY29udHJvbHMucGxheWVyKWc9Cm5ldyB1YShnKSx0aGlzLkkoZyl8fCh0aGlzLkwoZyksKG5ldyB2YShnLHRoaXMuQSkpLmIoKSk7ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19KX0pKGMpO3ZhciB3YT1jLkhsfHx3YSx4YT1uZXcgd2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUGc9dGhpcy5hWzldO3RoaXMuU2o9dGhpcy5hWzNdO3RoaXMuJHE9dGhpcy5hWzVdO3RoaXMudXQ9dGhpcy5hWzNdO3RoaXMuT2g9dGhpcy5hWzRdO3RoaXMuc289dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5IbT1iO2IucHJvdG90eXBlPXtPZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUGc6dGhpcy5SaihhKX0sUmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlNqOnRoaXMuWnEoYSl9LFpxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy4kcTp0aGlzLnR0KGEpfSx0dDpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLnV0OnRoaXMuTmgoYSl9LE5oOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5PaDp0aGlzLnJvKGEpfSxybzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB5YT1jLkhtfHx5YSxQYz1uZXcgeWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1QYy5PZyg0KTsoZnVuY3Rpb24oYyl7Yy51bD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIpe3ZhciBhPWIuZWxfO2F8fChhPWIuZWwoKSk7YT8odGhpcy5PKGEpLChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksCmI/dGhpcy5SKGIpOnRoaXMuZGEoKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMiYmdGhpcy5KJiZ0aGlzLkooKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYil0cnl7dmFyIGE9SlNPTi5wYXJzZShiKTtpZihhLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFhWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGIuYXV0b3BsYXk/CmIuYXV0b3BsYXkoKTohMX0samI6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLnVsfHx6YTsoZnVuY3Rpb24oYyl7Yy50bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMudW4oKTsKdGhpcy5IYSgpfSxVdTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuZWIoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuYmEsIjsiLHR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6CiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5GP2IuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsCiI7IixiLkYmJmIuRi5zYT9iLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLGIuRiYmYi5GLnNhP3R5cGVvZiBiLkYuc2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsCmIuaW1hP2IuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLkY/Yi5GLm1hOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmCnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFZiOmZ1bmN0aW9uKCl7aWYoIXRoaXMubWEpe3ZhciBiPXRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj0KdGhpcy5TYSgpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLlhiPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5YYj1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLlhifSxhcTpmdW5jdGlvbigpe2lmKCF0aGlzLnhmKXt2YXIgYj10aGlzLlNhKCksYT10aGlzLlpwKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LFpwOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuV2EoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLApmdW5jdGlvbigpe3RoaXMuTmI9ITA7Zi5pYigiY2hpcC5kZSIpJiZmLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLk5ifHwodGhpcy5sKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5XKCksdGhpcy5vKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sRnU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSx1bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJpbWEzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy5XKCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8CmIuY3VycmVudFRpbWUoKSlpZih0aGlzLmFxKCkpe3ZhciBhPXRoaXMuU2EoKSxnPXRoaXMuVmIoKTthJiZnJiYodGhpcy5TYSgpLHRoaXMuVmIoKSx0aGlzLnRkfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGQ/dGhpcy5tKCk6KHRoaXMuVyghMCksdGhpcy5sKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuU2EoKX1lbHNlIHRoaXMueWY/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fAp0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5TZigpfS5iaW5kKHRoaXMpLDUwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2bjpmdW5jdGlvbigpe3RoaXMuUWJ8fCh0aGlzLlFiPSJ1bmtub3duIik7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/Cih0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaGEoKXx8KGJ8fCh0aGlzLnpnPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMudyh0aGlzLnpnLGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxBbjpmdW5jdGlvbigpe3RoaXMuUHV8fCgxMDx0aGlzLkh0Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5IdCsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLlZyKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTApKSl9LFZyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJgohdGhpcy5JdCl7dGhpcy5JdD0hMDt2YXIgYT0iIjtiLnZwRXZlbnQucmFuZG9tVGVzdCYmKGE9IiIpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgQWE9Yy50bHx8QWE7KGZ1bmN0aW9uKGMpe2Mudmw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPApmLkRhKGEpKXtiPWE7Zm9yKHZhciBnIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShnKSYmKGE9bmV3IHphKGJbZ10pLGEuamF8fHRoaXMuSShhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5MKGEpLChuZXcgQWEoYSx0aGlzLkEpKS5iKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sSDpmdW5jdGlvbigpe3RoaXMucWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksdGhpcy5hYyl9fSl9KShjKTt2YXIgQmE9Yy52bHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZpPXRoaXMuYVszXTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLnN0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuZ3I9YjtiLnByb3RvdHlwZT17dWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnZpOnRoaXMuSnIoYSl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiA3PAphP3RoaXMuS3I6dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnN0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5ncnx8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMudWkoNCk7KGZ1bmN0aW9uKGMpe2MuWGs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpO2IuZ2V0V3JhcHBlckVsZW1lbnQmJihhPWIuZ2V0V3JhcHBlckVsZW1lbnQoKSk7dGhpcy5PKGEpOyhhPWIuZ2V0UGxheWVyKCkuZWwpfHwoYT1iLmdldFBsYXllcigpKTt0aGlzLlIoYSl9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKTpiLmlzUGF1c2VkKCkmJih3aW5kb3cuc2V0VGltZW91dCh0aGlzLnBsYXkuYmluZCh0aGlzKSwwKSxiLmdldFBsYXllcigpLnBsYXkoKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4idG9ubGluZSJ9LGhiOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllci5wbGF5ZXI7CmEuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMuWGt8fEVhOyhmdW5jdGlvbihjKXtjLldrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9Yi5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZTtiLmdldFBsYXllcigpLmFkX2Vycm9yJiYhYSYmKGE9ImFkX2Vycm9yIik7Yi5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFhJiYoYT0iYWRfZmFpbGVkIik7aWYoOTAxPT1hKXRoaXMubSgpOwplbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlO2EuZ2V0UGxheWVyKCkuYWRfZXJyb3ImJiFnJiYoZz0iYWRfZXJyb3IiKTthLmdldFBsYXllcigpLmFkX2ZhaWxlZCYmIWcmJihnPSJhZF9mYWlsZWQiKTtpZig5MDE9PWcpdGhpcy5tKCk7ZWxzZXtpZigxMDA5PT0KZ3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoITApOmEuZ2V0UGxheWVyKCkuYWRzX2xvYWRlcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy53KCEwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudWMoITApfS5iaW5kKHRoaXMpLDEwMCl9fWVsc2UgdGhpcy5tKCk7ZWxzZSBhLmdldFBsYXllcigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWMuYmluZCh0aGlzKSwxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksCnRoaXMubSgpKTsiZmlyc3RRdWFydGlsZSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJtaWRwb2ludCI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJ0aGlyZFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7ImFkTG9hZGluZ0Vycm9yIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiZudWxsPT10aGlzLnpiJiYodGhpcy56Yj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWN8fCh0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpOwpiLmFkc19sb2FkZXI/Yi5hZHNfbG9hZGVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciYmYi5hZHNfbG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthLmdldEVycm9yKCk7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmwoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpO2lmKDEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpKXRoaXMuZWM9ITAsdGhpcy5tKCk7OTAxPT1hLmdldEVycm9yQ29kZSgpJiZ0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMuV2t8fEZhOyhmdW5jdGlvbihjKXtjLllrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmCnZpZGVvLmdldFBsYXllciYmdmlkZW8uZ2V0UGxheWVyKCkmJih2aWRlby5nZXRQbGF5ZXIoKS5lbHx8ImZsYXNoIj09dmlkZW8ucGxheWVyX3R5cGUpKXt2YXIgYj1uZXcgRWEodmlkZW8pO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IEZhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBHYT1jLllrfHxHYSxIYT1uZXcgR2EocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVm89dGhpcy5hWzRdO3RoaXMudms9dGhpcy5hWzJdO3RoaXMuaHU9dGhpcy5hWzNdO3RoaXMuWGo9dGhpcy5hWzldO3RoaXMudHI9dGhpcy5hWzNdO3RoaXMucHE9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbM119Yy5mbz1iO2IucHJvdG90eXBlPXtVbzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVm86dGhpcy51ayhhKX0sdWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZrOgp0aGlzLmd1KGEpfSxndTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuaHU6dGhpcy5XaihhKX0sV2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlhqOnRoaXMuc3IoYSl9LHNyOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy50cjp0aGlzLm9xKGEpfSxvcTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5mb3x8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuVW8oNCk7KGZ1bmN0aW9uKGMpe2MuYmg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlOwp0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy5iaHx8SmE7KGZ1bmN0aW9uKGMpe2MuYWg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTsKYi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5CRUdJTixmdW5jdGlvbigpe3RoaXMubCgiY29udGVudHBsYXkiKTt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKEJDTWVkaWFFdmVudC5QTEFZLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMuYWh8fEthOyhmdW5jdGlvbihjKXtjLmRoPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLApkPSExO2cmJihkPWcuZ2V0TW9kdWxlKEFQSU1vZHVsZXMuVklERU9fUExBWUVSKSk7aWYoZyYmZCYmZC5pc1BsYXllckRlZmluZWQoKSlkPW5ldyBKYShkLGEpLHRoaXMuSShkKXx8KGQuTGQoYSksdGhpcy5MKGQpLGQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy5kaHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy54bz10aGlzLmFbM107dGhpcy5nPXRoaXMuYVsyXX1jLmpqPWI7Yi5wcm90b3R5cGU9e3dvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy54bzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIE5hPWMuamp8fE5hLFNjPW5ldyBOYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1TYy53byg0KTsoZnVuY3Rpb24oYyl7Yy51aj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmdhbWVDb250YWluZXJbMF07dGhpcy5PKGIpO3RoaXMuUihiKX0scGF1c2U6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy52aWRlb1RhZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IiksYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0uZGF0YT0iIixiW2FdLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmxvYWRHYW1lKCl9LFdhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7JCYmJCgiYm9keS5kZXZpY2VfdGFibGV0IikmJjA8JCgiYm9keS5kZXZpY2VfdGFibGV0IikubGVuZ3RoJiYoYj0hMCk7JCYmJCgiYm9keS5kZXZpY2VfbW9iaWxlIikmJgowPCQoImJvZHkuZGV2aWNlX21vYmlsZSIpLmxlbmd0aCYmKGI9ITApO3JldHVybiBifSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk5pY2tHYW1lTG9hZGVyIn19KX0pKGMpO3ZhciBPYT1jLnVqfHxPYTsoZnVuY3Rpb24oYyl7Yy50aj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5XYSgpPygkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRhcCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSwkKCIjZ2FtZS1sYXVuY2ggLmxhdW5jaC1nYW1lIikub24oInRvdWNoc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5sYygpfS5iaW5kKHRoaXMpKSk6dGhpcy5sYygpfSxsYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZERhdGFSZWNlaXZlZD8KYi5hZENvbnRleHQuX2FkUmVzcG9uc2U/dGhpcy5tKCk6KHRoaXMubCgiYWRlcnJvciIsIm5vQWRSZXNwb25zZSIpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwyMDApfX0pfSkoYyk7dmFyIFBhPWMudGp8fFBhOyhmdW5jdGlvbihjKXtjLnZqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5OSUNLJiZOSUNLLkdhbWVMb2FkZXImJk5JQ0suR2FtZUxvYWRlci5nYW1lQ29udGFpbmVyKXt2YXIgYj1uZXcgT2EoTklDSy5HYW1lTG9hZGVyKTt0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBQYShiLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgUWE9Yy52anx8UWEsUmE9bmV3IFFhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxuPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzRdfQpjLmFuPWI7Yi5wcm90b3R5cGU9e2tuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5sbjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIFNhPWMuYW58fFNhLFRjPW5ldyBTYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVRjLmtuKDQpOyhmdW5jdGlvbihjKXtjLmJrPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3RoaXMuVWQ9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7aWYoIWEmJihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmlkJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllckluc3RhbmNlLmlkKSkmJihhPWIucGFyZW50Tm9kZSksIWEpKXt0aGlzLmRhKCk7cmV0dXJufXRoaXMuTyhhKTsKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuUihiKTp0aGlzLmRhKCl9LEVyOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZmIsZz10aGlzLmViKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLlliJiYoMDw9Zy5pbmRleE9mKGQpfHxhLlRkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy5VZD0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSx3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2soKSl9LGpiOmZ1bmN0aW9uKCl7dGhpcy5VZCsrOwppZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lOwppZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBiLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sSzpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sZWE6ZnVuY3Rpb24oKXt9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9fSl9KShjKTsKdmFyIFRhPWMuYmt8fFRhOyhmdW5jdGlvbihjKXtjLmFrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5nYnx8KHRoaXMuZ2I9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5nYisrLDE1PHRoaXMuZ2IpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubyghMCk7ZWxzZXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWR2ZXJ0aXNpbmcpaWYoYj1iLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLApmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5VPWEsYi5sKCJhZGVycm9yIixhKSl9cmV0dXJuIGd9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJgoiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuVmEoKTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVnaXN0ZXJFdmVudCYmIXRoaXMuV28/KHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX0FERVJST1IsCmZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLldvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsZnVuY3Rpb24oYSl7Yi5FcihhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt0aGlzLncoYil9fSl9KShjKTt2YXIgVWE9Yy5ha3x8VWE7KGZ1bmN0aW9uKGMpe2MuY2s9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy53YT0xNTAwO3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pO2EuamF8fHRoaXMuSShhKXx8KHRoaXMuTChhKSwobmV3IFVhKGEsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBWYT1jLmNrfHxWYSxXYT1uZXcgVmEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVGw9dGhpcy5hWzddO3RoaXMuTG09dGhpcy5hWzVdO3RoaXMuV2g9dGhpcy5hWzEwXTt0aGlzLmVvPXRoaXMuYVsyXTt0aGlzLmpyPXRoaXMuYVsxMF07dGhpcy5SaT10aGlzLmFbOF07dGhpcy5wbD10aGlzLmFbN107dGhpcy54aj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsxMF19Yy5kcz1iO2IucHJvdG90eXBlPXtTbDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLlRsOnRoaXMuS20oYSl9LEttOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTG06dGhpcy5WaChhKX0sVmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldoOnRoaXMuY28oYSl9LGNvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lbzp0aGlzLmlyKGEpfSxpcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuanI6dGhpcy5RaShhKX0sUWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlJpOnRoaXMub2woYSl9LG9sOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5wbDp0aGlzLndqKGEpfSx3ajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBYYT1jLmRzfHxYYSxVYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0KVWMuU2woNCk7KGZ1bmN0aW9uKGMpe2MuaWk9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLk8oYi5lbGVtZW50KTt0aGlzLlIoYi5lbGVtZW50KX0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlcGxheWVyKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmZpbmlzaCgpfSxoYjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLm11dGVkfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkhpdGJveCJ9fSl9KShjKTt2YXIgWWE9Yy5paXx8WWE7KGZ1bmN0aW9uKGMpe2MuaGk9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuZGV0YWlsJiYiMTAxMCI9PWIuZGV0YWlsLmNvZGUmJmEuaW1wcmVzc2lvbiYmYS5pbXByZXNzaW9uKCl9LmJpbmQodGhpcykpO3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoKX19KX0pKGMpO3ZhciBaYT1jLmhpfHxaYTsoZnVuY3Rpb24oYyl7Yy5qaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGl0Ym94LmFkYmxvY2tlciIsZnVuY3Rpb24oYil7Yj1uZXcgWWEoYi5kZXRhaWwpO2IuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFphKGIsdGhpcy5BKSkuYigpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgJGE9Yy5qaXx8JGEsYWI9bmV3ICRhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlrPXRoaXMuYVsyXTt0aGlzLlhpPQp0aGlzLmFbMTBdO3RoaXMuV3A9dGhpcy5hWzEwXTt0aGlzLmNpPXRoaXMuYVsxXTt0aGlzLkR0PXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzhdfWMuaHI9YjtiLnByb3RvdHlwZT17aGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5pazp0aGlzLldpKGEpfSxXaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWGk6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5XcDp0aGlzLmJpKGEpfSxiaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY2k6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkR0OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgYmI9Yy5ocnx8YmIsVmM9bmV3IGJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9VmMuaGsoNCk7CihmdW5jdGlvbihjKXtjLlRpPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzt2YXIgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtnLnN0eWxlLndpZHRoPWIud2lkdGg7Zy5zdHlsZS5taW5XaWR0aD1iLndpZHRoO2cuc3R5bGUubWF4V2lkdGg9Yi53aWR0aDtnLnN0eWxlLmhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtnLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2cuc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iOyJiZWZvcmUiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhKToiYWZ0ZXIiPT10aGlzLllmP2EucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxhLm5leHRTaWJsaW5nKTphLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0saGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sem46ZnVuY3Rpb24oKXtmLkRmKHRoaXMuRGMpO2YuRWYodGhpcy5EYyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnpuKCl9LmJpbmQodGhpcyksNTApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LEhkOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgY2I9Yy5UaXx8Y2I7KGZ1bmN0aW9uKGMpe2MuU2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMubCgiZXh0ZXJuYWwiKTt0aGlzLncoITApfX0pfSkoYyk7dmFyIGRiPWMuU2l8fGRiOyhmdW5jdGlvbihjKXtjLlVpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiYKay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBlYj1jLlVpfHxlYixmYj1uZXcgZWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQnI9dGhpcy5hWzFdO3RoaXMuem89dGhpcy5hWzRdO3RoaXMuZnI9dGhpcy5hWzJdO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuUWs9dGhpcy5hWzldO3RoaXMuJHQ9dGhpcy5hWzJdO3RoaXMuZmg9dGhpcy5hWzVdO3RoaXMuTGk9dGhpcy5hWzEwXTt0aGlzLnltPQp0aGlzLmFbMV07dGhpcy5FbD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLndtPWI7Yi5wcm90b3R5cGU9e0FyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Ccjp0aGlzLnlvKGEpfSx5bzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuem86dGhpcy5lcihhKX0sZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmZyOnRoaXMucG8oYSl9LHBvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5xbzp0aGlzLlBrKGEpfSxQazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFrOnRoaXMuWnQoYSl9LFp0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuJHQ6dGhpcy5laChhKX0sZWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZoOnRoaXMuS2koYSl9LEtpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5MaTp0aGlzLnhtKGEpfSx4bTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueW06dGhpcy5EbChhKX0sRGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPAphP3RoaXMuRWw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy53bXx8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuQXIoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLnVybD1hO3RoaXMubWV0aG9kPSJHRVQiO3RoaXMuZGF0YT17fX1jLnBpPWI7Yi5wcm90b3R5cGU9e3NldERhdGE6ZnVuY3Rpb24oYSl7dGhpcy5kYXRhPWF9LG1zOmZ1bmN0aW9uKGEpe3RoaXMubWV0aG9kPWF9LGFwcGVuZERhdGE6ZnVuY3Rpb24oYSxiKXt0aGlzLmRhdGFbYV09Yn0sa206ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuYXBwZW5kRGF0YSgiaG9tYWRfbWFjcm9zIixKU09OLnN0cmluZ2lmeShhKSl9Y2F0Y2goYil7fX19fSkoYyk7dmFyIHo9Yy5waXx8ejsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLApnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwyMDAhPWYuc3RhdHVzJiYyMDEhPWYuc3RhdHVzfHxnKGYpO2lmKGQmJjQ9PWYucmVhZHlTdGF0ZSYmMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1cylkKGYpO2Vsc2UgaWYoND09Zi5yZWFkeVN0YXRlJiYwPT1mLnN0YXR1cyYmbSYmbS5GZCh0aGlzLklhLnVybCkmJm0uZGQpe3ZhciBoPW5ldyB6KGEudXJsKTtoLm1zKCJQT1NUIik7aC5zZXREYXRhKHtob21hZF9waW5nOiJ0cnVlIn0pOyhuZXcgYihoLGZ1bmN0aW9uKGEpe3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpfWNhdGNoKGcpe2I9ITF9YiYmYi5waW5nJiYicG9uZyI9PWIucGluZyYmCihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMucmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGEpe3ZhciBiPWEsYT0iIixkO2ZvcihkIGluIGIpYSs9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChiW2RdKTthPWEuc3Vic3RyKDEpfXRoaXMuZGYmJihhKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RyeXt0aGlzLm5nP3RoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMSk6dGhpcy5OYS5vcGVuKHRoaXMuSWEubWV0aG9kLHRoaXMuSWEudXJsLCEwKSx0aGlzLktnfHwodGhpcy5OYS53aXRoQ3JlZGVudGlhbHM9ITApLDA8YS5sZW5ndGgmJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwKImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiZtLkZkKHRoaXMuSWEudXJsKT9tLmRkP20uZ2EoInJlcXVlc3RfZmFpbGVkIik6Zi50cmFjaygiY2hlY2siLCJyZXF1ZXN0X2ZhaWxlZCIsITApOm0uRmQodGhpcy5JYS51cmwpLHRoaXMuVGYmJnRoaXMuVGYoKX1yZXR1cm4gdGhpcy5OYX19fSkoYyk7dmFyIGhiPWMucml8fGhiOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5vYT0hMTt0aGlzLk9iPSIiO3RoaXMudWQ9dGhpcy5iYj1udWxsO3RoaXMuYW89dGhpcy5uYj10aGlzLkxmPSExO3RoaXMudWE9IiI7dGhpcy5HZj0hMTt0aGlzLnphPXRoaXMuSmM9IiI7dGhpcy5DZj10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy5oYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy54ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuSGI9IiI7dGhpcy5vYj1bXTt0aGlzLkliPVtdO3RoaXMuR2I9IiI7dGhpcy5sZT0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNkPSExO3RoaXMuQm49dGhpcy5lZD1udWxsO3RoaXMuZmM9dGhpcy5BZz10aGlzLm5lPXRoaXMuZGQ9dGhpcy52ZD10aGlzLmpjPSExO3RoaXMuUGE9e2dsb2JhbDohMSxjbGllbnQ6ITEsY3VzdG9tZXI6ITF9fQpjLnNpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmJiLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLmFvLGhvbWFkQWxpYXM6dGhpcy51YSxpc0luaXRpYWxpemVkOnRoaXMuR2YsZ2xvYmFsQ29uZmlnOnRoaXMuSmMsY2xpZW50Q29uZmlnOnRoaXMuemEsaXNFbmFibGVkOnRoaXMuaXNFbmFibGVkLGlzVmVyaWZpZWQ6dGhpcy5ZLGlzQmxvY2tlZDp0aGlzLkNmLHNlcnZlcjp0aGlzLk1hLHN2bUNvbmZpZzp0aGlzLkZiLGhvbWFkQWRwYXRoOnRoaXMudGYsZGlzYWJsZUNvb2tpZVRlc3Q6dGhpcy55ZCx0ZXN0Q29va2llQXR0ZW1wdHM6dGhpcy5rZSxIT01BRF9WRVJJRklFRDp0aGlzLnllLEhPTUFEX0JMT0NLRUQ6dGhpcy53ZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5zYiwKSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkJuLGFkQmxvY2tlckRldGVjdGVkOnRoaXMuamMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnZkLHVzZVN0cmljdENoZWNrczp0aGlzLmRkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLm5lLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuUGEsc2l0ZUNvbmZpZzp0aGlzLkViLHNlcnZlcklkOnRoaXMuZmcsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLlNiLHZwYWlkOnRoaXMuZmN9fSxEcDpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYKMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxqcDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LEtzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLmtiKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1mLlptKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrKGYucXVlcnk/Ij8iK2YucXVlcnk6IiIpKTtkJiYodGhpcy5PYnx8dGhpcy5iYnx8dGhpcy51ZCkmJihrPXRoaXMuUXEoaykpO2E9bmV3IHooaCk7YS51cmw9aDtoPSIiO2g9Yz9mLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5rcChmLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWg7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9azthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihrKTthLm1ldGhvZD0iUE9TVCI7cmV0dXJuIGF9LApPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxaYjpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5NYSYmdGhpcy5NYS5sZW5ndGgmJjA8dGhpcy5NYS5sZW5ndGgmJihiPXRoaXMuTWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPWIuc3BsaXQoIi4iKSkmJmFbMF0mJiJbaGFzaF0iPT1hWzBdPyExOiEwKTtyZXR1cm4gYX0sRmQ6ZnVuY3Rpb24oYSl7dmFyIGI9CiExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGtwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLnh1O3JldHVybiJub25lIn0sTGM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NYVt0aGlzLmZnXX0sYWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLmpnKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLGIuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LFFxOmZ1bmN0aW9uKGEpe3RoaXMuT2ImJgooYSs9dGhpcy5PYik7aWYodGhpcy5iYilmb3IodmFyIGIgaW4gdGhpcy5iYil0aGlzLmJiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmJiW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj1oO3RoaXMuRXEoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuemEpdGhpcy5DcSgpO2Vsc2UgdHJ5e3RoaXMuemE9YigpLHRoaXMud2MoKX1jYXRjaChrKXt0aGlzLmdhKCJub0NsaWVudENvbmZpZyIpfX0sWWE6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEVxOmZ1bmN0aW9uKCl7dGhpcy5GYShuZXcgeih0aGlzLkpjK3RoaXMub2MoImdsb2JhbCIpKSwKdGhpcy55cC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxDcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY2xpZW50Iik7dGhpcy5nYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2M6ZnVuY3Rpb24oYSl7dmFyIGI9Ij9jYWNoZT0iK3RoaXMua2IoKTt0aGlzLkViJiZ0aGlzLkViLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoYj0iIik7dGhpcy5FYiYmdGhpcy5FYi5ub0NhY2hlQnVzdGVyJiYoYj0iIik7cmV0dXJuIGJ9LGdhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnZkKXt0aGlzLnZkPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwppZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMud2UpKTt0aGlzLnJiKCk7Zi5UYihsLnVyKTsoYj1mLm9mKHRoaXMuTGMoKSkpfHwoYj1mLm9mKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpKTthfHwoYT0idW5rb3duIik7Zi50cmFjaygic3RhdHNfaGRfcGVuYWx0eSIsYSwhMCl9fSx5cDpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChjKXtiLmVuYWJsZWQ9ImZhbHNlIn10aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5ZPSF0aGlzLmlzRW5hYmxlZDsKdGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJihiPWEucmVzcG9uc2VUZXh0KTthPXt9O2lmKGIpdHJ5e2E9SlNPTi5wYXJzZShiKX1jYXRjaChjKXthPXRoaXMuemF9ZWxzZSBhPXRoaXMuemE7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihhLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5NYT1hLnNlcnZlcnx8W107dGhpcy5GYj1hLmNvbmZpZ3x8IiI7dGhpcy51YT1hLmFsaWFzfHxudWxsO3RoaXMudGY9YS5hZHBhdGh8fCIiO3RoaXMueWQ9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5mZz1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5NYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiYKdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9bmV3IHoodGhpcy5hZSgpKSxjPXRoaXMuS2EodGhpcy5GYik7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1jLnBhdGguc3Vic3RyKDEpLnJlcGxhY2UoImhvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vIiwiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLkZiK3RoaXMub2MoImN1c3RvbWVyIikpO3RoaXMuRmEoYix0aGlzLk1zLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmNlKCJjdXN0b21lciIpO2E/dGhpcy5Haz90aGlzLmdhKCJub1NWTUNvbmZpZyIpOgoodGhpcy5Haz0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LE1zOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD10aGlzLkpiKGIuc3RyaWN0KTt0aGlzLm5lPXRoaXMuSmIoYi5zdHJpY3RfY29uZmlnX2VuYWJsZWQpO3RoaXMuQWc9Yi5kdXJhdGlvbl9jaGVja19lbmFibGVkfHwhMTt0aGlzLlNiPXRoaXMuSmIoYi5lbmFibGVRdWFydGlsZVRyYWNraW5nKTt0aGlzLmlzRW5hYmxlZD10aGlzLkpiKGIuZW5hYmxlZCk7dGhpcy5IYj1iLnRlc3RoaWRlfHwiIjt0aGlzLm9iPWIudGVzdGFkdGFnc3x8W107dGhpcy5JYj1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLk9iPWIuYWR0YWdwYXJhbWV0ZXJ8fCIiO3RoaXMuYmI9Yi5hZHRhZ21vZGlmaWVyfHwKbnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/dGhpcy5zcChiLnRlc3QzcmRwYXJ0eWNvb2tpZSk6Yi50ZXN0M3JkcGFydHljb29raWV8fCIiO3RoaXMueWQmJih0aGlzLkdiPW51bGwpO3RoaXMubGU9Yi50aHJvdHRsZXx8MDt0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphfHx7fTshdGhpcy5DZCYmdGhpcy5pc0VuYWJsZWQ/KHRoaXMuQ2Q9ITAsdGhpcy5RYyghMCkpOnRoaXMuaXNFbmFibGVkJiYhdGhpcy5mdCgpJiYodGhpcy5IYnx8dGhpcy5JYnx8dGhpcy5vYnx8dGhpcy5HYik/dGhpcy5aZD8odGhpcy5vYT10aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLllhKHRoaXMuc2IpKSwKdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5WcygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLldzKCkpfX0sVnM6ZnVuY3Rpb24oKXt0aGlzLlVzKCl9LFdzOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPSEwO3RoaXMuWXx8KHRoaXMuWT10aGlzLm9hPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYShhKSksdGhpcy5yYigpLHRoaXMud2QoKSl9LFVzOmZ1bmN0aW9uKCl7aWYodGhpcy5IYil7dmFyIGE9ITE7dHJ5e3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Iuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoImlkIix0aGlzLkhiKTtiLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJ3aWR0aDoxcHg7aGVpZ2h0OjFweDttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmMDAwMCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5xZygpfWVsc2UgdGhpcy5xZygpfSxwZzpmdW5jdGlvbigpe3ZhciBlO3ZhciBjO2Z1bmN0aW9uIGEoKXtlPWMuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigpKTt0aGlzLlpzKGUsMDxjLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5pZS5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuY2QodGhpcy5oYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfXRoaXMub2I9bnVsbCx0aGlzLmllKCl9LFpzOmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7ZigpJiYKYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy4kcyhlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMucGcuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZSsiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuSWImJnRoaXMuSWIubGVuZ3RoKXt2YXIgYz10aGlzLkliLnNsaWNlKCksZTthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMucGcoKX0sJHM6ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGUoKXtoKCkmJmIoKX1mdW5jdGlvbiBmKCl7aCgpJiYKYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7bC5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtsLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2wub25sb2FkPWU7bC5vbmVycm9yPWY7bC5zcmM9YTtsLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmKX1jYXRjaChtKXtlKCl9fSxpZTpmdW5jdGlvbigpe3RoaXMuR2I/KHRoaXMua2UrKyx0aGlzLkZhKG5ldyB6KHRoaXMuR2IpLHRoaXMuVHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuamUoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5vZygpfSxqZTpmdW5jdGlvbihhKXt0aGlzLmNkKHRoaXMueGUsCiJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0sVHM6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLm9nKCk6dGhpcy5qZSgiQUFBIil9LG9nOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnNiKSk7dGhpcy5yYigpO3RoaXMud2QoKX0scmI6ZnVuY3Rpb24oKXt2YXIgYT0iMCIsYj0iMCI7Zi5XYSgpJiYoYT0iMSIpO3RoaXMuamMmJihiPSIxIik7Zi50cmFjaygic3RhdHNfaGRfbW9iaWxlX2FiIixhKyIiK2IsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5ZYSh0aGlzLnllKSk7dGhpcy5lZCYmImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSx5bjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuRHAoKSl7dmFyIGE9dGhpcy5qcCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxGYTpmdW5jdGlvbihhLGIsYyxlLGgsSWMpe2E9bmV3IGhiKGEsYixjKTtlJiYoYS5LZz0hMCk7aCYmZi5ncSgpJiYoYS5kZj0hMCk7SWMmJihhLm5nPSEwKTtyZXR1cm4gYS5sb2FkKCl9LE9lOmZ1bmN0aW9uKCl7Zi5XYSgpfHxmLlhhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSwKZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7cmV0dXJufWlmKGMpaWYoYT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSlpZihhWzBdJiYoYT1hWzBdKSxhKXtlPShhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiKS5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO3RoaXMuWmIoKXx8KGE9dGhpcy5LYShlKSxlPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2guYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7aC5uZXR3b3JrU3RhdGU9PQpoLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZ2EoIm1lZGlhZmlsZV9ub2FkIil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmdhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSx4bjpmdW5jdGlvbigpe3RoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMuVGEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiOwphLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy55dC5iaW5kKHRoaXMpLHRoaXMueHQuYmluZCh0aGlzKSl9LHl0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChlKXtyZXR1cm59Y3x8dGhpcy5MbygpfSx4dDpmdW5jdGlvbigpe30sTG86ZnVuY3Rpb24oKXtmLlRiKGwuS28pO2YudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuZ2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LHdkOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMubmIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5uYi5sZW5ndGg7YSsrKXt2YXIgYj10aGlzLm5iW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZmLlhhKGIudXJsLApiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LGZ0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LHNwOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxhfHwxMCkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWF8fDEwO2Zvcih2YXIgYj0iIixjPTA7YzxhO2MrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sSmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGMsZSxmLGgsayxsLG09MDttPGEubGVuZ3RoOyljPWEuY2hhckNvZGVBdChtKyspLAplPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQobCk7cmV0dXJuIGJ9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpOwphPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7Zm9yKHZhciBjPXt9LGU9MTQ7ZS0tOyljW2JbZV1dPWFbZV18fCIiO2MucXVlcnlLZXk9e307Y1tiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihjLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGN9LGpnOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGM9IiIsZyxkO2ZvcihnPTc7MDw9ZztnLS0pZD1hPj4+NCpnJjE1LGMrPWQudG9TdHJpbmcoMTYpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZSxmLGg9QXJyYXkoODApLAprPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpO3N3aXRjaChuJTQpe2Nhc2UgMDplPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmU9YS5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmU9YS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6ZT1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IoeS5wdXNoKGUpOzE0IT15Lmxlbmd0aCUxNjspeS5wdXNoKDApO3kucHVzaChuPj4+MjkpO3kucHVzaChuPDwzJjQyOTQ5NjcyOTUpOwpmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTIwOzM5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT00MDs1OT49ZTtlKyspeD1jKGYsNSkrKG4mcHxuJnd8cCZ3KSt0K2hbZV0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NjA7Nzk+PWU7ZSsrKXg9YyhmLDUpKyhuXnBedykrdCtoW2VdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsCmY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuc2l8fGliLG09bmV3IGliO3dpbmRvdy5DdT1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlduPXRoaXMuYVs5XTt0aGlzLnlxPXRoaXMuYVsxXTt0aGlzLnJxPXRoaXMuYVs4XTt0aGlzLmtvPXRoaXMuYVs0XTt0aGlzLlV0PXRoaXMuYVs1XTt0aGlzLmRsPXRoaXMuYVs4XTt0aGlzLnF0PXRoaXMuYVs1XTt0aGlzLkxwPXRoaXMuYVsxMF07dGhpcy5HbT10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs4XX1jLk1wPWI7Yi5wcm90b3R5cGU9e1ZuOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Xbjp0aGlzLnhxKGEpfSwKeHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnlxOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ycTp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMua286dGhpcy5UdChhKX0sVHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlV0OnRoaXMuY2woYSl9LGNsOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5kbDp0aGlzLnB0KGEpfSxwdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXQ6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkxwOnRoaXMuRm0oYSl9LEZtOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuR206dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBqYj1jLk1wfHxqYixYYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuVm4oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5YbT0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpO2MmJiJ0cnVlIj09U3RyaW5nKGMuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpJiYodGhpcy5wbT1jLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKTsKdGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMuanQ9dGhpcy4kYT0hMX1jLmxpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiZ0aGlzLmNvbmZbdGhpcy5MYV1bYV0mJihiPXRoaXMuY29uZlt0aGlzLkxhXVthXSk7cmV0dXJuIGJ9LHVnOmZ1bmN0aW9uKCl7InByZXJvbGwiPT1mLkVhJiZmLnRyYWNrKCJzdGF0c19oZF9hY3RpdmUiLAoiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLmRtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLiRhPWM7aWYodGhpcy5ULlkpdGhpcy5ULnluKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDohMH0pKTp0aGlzLkFhKCk7ZWxzZXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLkpkKGEsYixjKX0sNTApfX0sVmQ6ZnVuY3Rpb24oYSl7dGhpcy5FYz0KITE7dGhpcy5zPWE7dGhpcy51cyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMudXAoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sdXA6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxmLnB1c2goaCkpO2Zvcih2YXIgaz0wO2s8ZS5sZW5ndGg7aysrKWVba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxmLnB1c2goaCkpLAplW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlP2YuRChsLlJ0LHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk6KGYuS2QoKSxiPT1DLkJlLmNvZGUmJmYuRChsLlVxLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpO2YuRChsLkpvLHRoaXMucy5QLHRoaXMuai51LkIoKSwKdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC56dCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5hdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuZHUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuVnEsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSxmLnRyYWNrKCJub21lZGlhIiwiMTAyIiksYz0ic3RhdHNfaGRfYWRfZXJyb3Jfbm9tZWRpYSIsdGhpcy5SYnx8KGYudHJhY2soIm5vbWVkaWFfbm9mbGFzaCIsCiIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sdXM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihiPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5yYS56SW5kZXg9YjtiPXRoaXMuai5DO2IuVnU9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249CnRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5wbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMubG0oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLm5tKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYikpOnRoaXMucy5NbigpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAp0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLnNzKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sc3M6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmZi5vbSh0aGlzLnMub3JpZ2luLnRlKTtmLlphKCJzZXRVcFZwYWlkIik7dmFyIGI9dGhpcy5qLkM7dGhpcy5qLkM9Qi5wb3AoKTtiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuai5DLApiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5qLkcuYXBwZW5kQ2hpbGQodGhpcy5YKTt0aGlzLlgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zLndwKCksYz1hKHRoaXMucy5QLk9yaWdpbmFsQWRQYXJhbWV0ZXJzKSwKZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLAo1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7Yj1mLnFuKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsCnRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMuTXQoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuTnQoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlF0KCksIkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlB0KCksIkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLk90KCkpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGNvbnRpbnVlY29udGVudCIsZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcykpOwpmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LE50OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LE10OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuWmEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuWmEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuWmEoImZpcnN0UXVhcnRpbGUiKX0sUXQ6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi5aYSgidGhpcmRRdWFydGlsZSIpfSxQdDpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7Zi5aYSgiY29tcGxldGUiKX0sT3Q6ZnVuY3Rpb24oKXtmLlphKCJhZHN0b3BwZWQiKTt0aGlzLkFhKCl9LGxtOmZ1bmN0aW9uKGEsYil7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7dmFyIGU9YixmPXRoaXMuVDsKZi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLkZ0LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxubTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LFhjOmZ1bmN0aW9uKGEpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IiwKdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuWG0pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuV2EoKSYmdGhpcy5ULkFnJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5zLmR1cmF0aW9uLWEudGFyZ2V0LmR1cmF0aW9uKSl7dGhpcy5BYnx8KHRoaXMuQWI9ITAsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLlQuZ2EoInZpZGVvLW5vb3AiKSk7CnJldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLkV0KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9dGhpcy5qLkcsYz0wO2M8Yi5jaGlsZHJlbi5sZW5ndGg7YysrKXRoaXMuS2MucHVzaChiLmNoaWxkcmVuW2NdKSxiLmNoaWxkcmVuW2NdLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Yy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCmZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcHJlSWZyYW1lQ2xvc2VkIixiLCEwKX19LmJpbmQodGhpcykpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZU9wZW5lZCIsCiIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5CYi5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYi5iaW5kKHRoaXMpKSk6SD1mdW5jdGlvbigpe3RoaXMubmN8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLmhlKCkpfS5iaW5kKHRoaXMpOwp0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5abCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LEZ0OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5FZCgpPwp0aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuanQpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLm10KGEpO3ZhciBiPSIiO2lmKHRoaXMucy5nZSl7dmFyIGM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5rZyk7YyYmKGI9dGhpcy5zLmdlLQphLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwuZW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLGMuaW5uZXJIVE1MPWIpfXRoaXMuY2FwdGlvbiYmKHRoaXMuY2FwdGlvbi5pbm5lckhUTUw9dGhpcy5wYy5yZXBsYWNlKCJbdGltZV0iLGYuZWYodGhpcy5zLmR1cmF0aW9uLQphKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giKTthLnNldEF0dHJpYnV0ZSgiaWQiLCJkaXNwbWFpbiIpO2Euc2V0QXR0cmlidXRlKCJuYW1lIiwiZGlzcG1haW4iKTsKYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5wcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7dGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGMpO3RoaXMuai5jYygpO3RoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKTsKYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLnduLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0scHA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmaC5pc0VuYWJsZWQmJiFoLlpiKCkmJihmPWguS2EoZiksZj1mLnByb3RvY29sKyI6Ly8iK2YuaG9zdCk7ZS51cmw9ZjthLnB1c2goYil9cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh7bWVkaWFmaWxlczphfSkpfSwKd246ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fGYudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxtdDpmdW5jdGlvbihhKXthPT10aGlzLndnfHx0aGlzLkFifHwoMD09YSYmKHRoaXMuJGEmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuJGEpLHRoaXMuJGE9CiExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuV2EoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLGYuRChsLmFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi5EKGwuZm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSx0aGlzLlJiJiZmLnRyYWNrKCJwbGF5ZWRXaXRoRmxhc2giLCIxMDMiKSksYT09Ck1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLiRsLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC5jbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZi5EKGwuaG0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSksZi5EKGwuaW0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSwKdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnZwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmJxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2YuRChsLmJtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSx7YWRJZDp0aGlzLmJkLmFkSWQsaW1wcmVzc2lvblVSTDpifSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSk6dGhpcy5JZChlLnVybCxlLnR5cGUpfWNhdGNoKGgpe31ifHwKKHRoaXMucy55YT10aGlzLlhuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5rbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0sdnA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxYbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxFdDpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSxFZzpmdW5jdGlvbigpe2YuRChsLkxuLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dGhpcy50cmFjaygiY2xpY2t0cmFja2luZyIpOyF0aGlzLkVjJiZmLldhKCkmJmYudHJhY2soInN0YXRzX2hkX2NsaWNrdGhyb3VnaEJlZm9yZTFzdFF1YXJ0aWxlIiwKZi5lcCgpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5iYWNrZ3JvdW5kPSJsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsMCwwLDAuMDUpIDAlLHJnYmEoMCwwLDAsMC4yNSkgMTAwJSkiLGEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9CiJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0KImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uO2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMubHQuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCnRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMua3QuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLHRoaXMuWmMuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsdGhpcy5XYi5iaW5kKHRoaXMpKTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9lLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOgooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtlLmlubmVySFRNTD0iIjthLmFwcGVuZENoaWxkKGIpO3RoaXMucy5nZSYmYS5hcHBlbmRDaGlsZChlKTthLmFwcGVuZENoaWxkKGMpO2Euc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5jYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LmhiJiZ0aGlzLmoudS5oYigpJiZ0aGlzLlJxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSxsdDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8odGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKToodGhpcy5qLkMucGF1c2UoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiwKdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LFlyOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxmLkQobC5JZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sa3Q6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBkKTt0aGlzLmouQy5tdXRlZD8KKHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFJxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsImNvbnRlbnQiLCEwKSl9LEJiOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLAp0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLiRhJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLiRhKSx0aGlzLiRhPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiZhKXtmb3IodmFyIGI9dGhpcy5qLkc7Yi5maXJzdENoaWxkOyliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCk7Yi5wYXJlbnR8fHRoaXMuai5jYygpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Muc2V0QXR0cmlidXRlKCJzcmMiLGEpO2Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsCiIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wb3N0SWZyYW1lT3BlbmVkIiwiIiwhMCl9ZWxzZSB0aGlzLnhkKCl9ZWxzZSB0aGlzLnhkKCl9LHhkOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMDt0aGlzLmouc2YoKTsKdGhpcy5qLlpyKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5XcigpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYoYT0hMCl9cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50YSgibWluVmlzIik7YSYmKGYuRWYodGhpcy52aWRlbyxhKT90aGlzLllyKCk6dGhpcy5UZCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5NZSgpfS5iaW5kKHRoaXMpLAoxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLmxpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkRvPXRoaXMuYVs5XTt0aGlzLk9yPXRoaXMuYVs4XTt0aGlzLmdpPXRoaXMuYVsyXTt0aGlzLkJvPXRoaXMuYVsxMF07dGhpcy5KbD10aGlzLmFbN107dGhpcy5Iaj10aGlzLmFbNV07dGhpcy5ObD10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLlFtPWI7Yi5wcm90b3R5cGU9e0NvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/CnRoaXMuRG86dGhpcy5OcihhKX0sTnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk9yOnRoaXMuZmkoYSl9LGZpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5naTp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuQm86dGhpcy5JbChhKX0sSWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkpsOnRoaXMuR2ooYSl9LEdqOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Iajp0aGlzLk1sKGEpfSxNbDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy5RbXx8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuQ28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPQpkfHx7fTtnPWM7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMuSmE9bnVsbDt0aGlzLmJhPVtdO3RoaXMuYWE9bnVsbDt0aGlzLk1iPSExO3RoaXMudGU9IiI7dGhpcy5zZT0hMTtkJiZkLmVtcHR5P3RoaXMuSXEoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+PFZBU1QgdmVyc2lvbj0iMy4wIj48L1ZBU1Q+Jyk6dGhpcy5sb2FkKCl9dmFyIGE9MCxnLGQ9W107Yy5zbD1iO2IucHJvdG90eXBlPXtsb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Zi5XZSgpLGI7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bS5UYShtLktzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSHEuYmluZCh0aGlzKSx0aGlzLkRxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPQowPHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6VkFTVEFkRGF0YSIpLmxlbmd0aD9bXTpbXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpOyJQbGF5bGlzdCI9PXRoaXMuSmEuZmlyc3RDaGlsZC5ub2RlTmFtZSYmYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixjKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1mLkVhKXRyeXt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOwowPj1iLmxlbmd0aCYmKGI9W10uc2xpY2UuY2FsbCh0aGlzLkphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZEJyZWFrIikpKTtiLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09Zi5FYXx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWYuRWEpdHJ5e3ZhciBnPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1nLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwKMSl9KTthPWEuY29uY2F0KGIpO2Euc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTotMX0pO3JldHVybiBhfSxIcTpmdW5jdGlvbihhKXt0aGlzLlByKGEpO3RyeXt0aGlzLkphPWEucmVzcG9uc2VYTUwsdGhpcy5KYXx8KHRoaXMuSmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSXE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsCiJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLmZhKHRoaXMuQmEoeC5rZCkpfXRoaXMuYmE9dGhpcy5mZigpO3RoaXMuTWI9dGhpcy5yZygpO3RoaXMuYmEubGVuZ3RoP3RoaXMuUmMoKTp0aGlzLmZhKHRoaXMuQmEoeC5nYyx7ZXJyb3I6dGhpcy5zZT9DLmpkOkMuQWV9KSl9LERxOmZ1bmN0aW9uKCl7dGhpcy5mYSh0aGlzLkJhKHguemUse2RlcHRoOmF9KSl9LFJjOmZ1bmN0aW9uKCl7dGhpcy5hYT10aGlzLmJhLnNoaWZ0KCk7dGhpcy5pcSgpP3RoaXMuYXQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy52dCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSx2dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLllzKCk/dGhpcy5YcygpPyEwOigtMSE9dGhpcy5VYigpPwp0aGlzLmZhKHRoaXMuQmEoeC52ZSkpOnRoaXMuZmEodGhpcy5CYSh4Lm5oKSksITEpOih0aGlzLmZhKHRoaXMuQmEoeC5nYyxDLkJlKSksITEpfSxWZDpmdW5jdGlvbihhKXthLnlhPWEueWEuY29uY2F0KHRoaXMuTWQoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy5NYjt0aGlzLnBhcmVudC5WZChhKX0sU246ZnVuY3Rpb24oKXt2YXIgYT1uZXcgbGI7YS5kdXJhdGlvbj10aGlzLlViKCk7YS5NPXRoaXMubGYoKTthLnZjPXRoaXMuZnAoKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLmJwKCk7YS5nZT10aGlzLnRwKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLmhwKCkpOmIueWEuY29uY2F0KHRoaXMubnAoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksCmE9MCx0aGlzLlJjKCkpOih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYSYmdGhpcy5wYXJlbnQuZmEoYiksYT0wKX0seGI6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQueGIoYSl9LCRlOmZ1bmN0aW9uKGEsYil7dGhpcy5mYSh0aGlzLkJhKGEsYikpfSxCYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBtYihhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LGF0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sWXM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxYczpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sUHI6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPQphLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt9dHJ5e3RoaXMuc2U9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0saXE6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLnFmKCkubGVuZ3RofSxxZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFwKHRoaXMuYWEsIlZBU1RBZFRhZ1VSSSIpfSxNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sCm5wOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LGhwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5NZCgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxmcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnliKHRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLApBdTphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy55YihhW2NdKX0pO3RyeXt2YXIgZz1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksZD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LGJwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0KIiIsZj1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7ZD1iPXRoaXMucmYoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9Zy5wdXNoKGMpO2YucHVzaChkKX0xPGEubGVuZ3RoPyhiPWcsaD1kKTooYj1jLGg9Zik7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LFViOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sdHA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5GcyhnLGEpLDA+CmImJihiPSExKX1jYXRjaChkKXtiPSExfXJldHVybiBifSxxcDpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMueWIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHhwOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSx5YjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnJmKGEpOiIifSxyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnhwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5zbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gbj10aGlzLmFbMV07CnRoaXMuZnM9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzhdO3RoaXMuUWo9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbNF19Yy53aD1iO2IucHJvdG90eXBlPXtFbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRm46dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmZzOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Qbzp0aGlzLlBqKGEpfSxQajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuUWo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBuYj1jLndofHxuYixaYz1uZXcgbmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5Fbig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT0KW107dGhpcy52Yz0iIjt0aGlzLlA9dGhpcy52Yj0hMTt0aGlzLm9yaWdpbj1udWxsfWMubms9YjtiLnByb3RvdHlwZT17TW46ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sd3A6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5NLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBsYj1jLm5rfHxsYjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5scj10aGlzLmFbNl07dGhpcy5ZaD10aGlzLmFbMTBdO3RoaXMuenI9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOV19Yy5IaD1iO2IucHJvdG90eXBlPXtrcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubHI6dGhpcy5YaChhKX0sWGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlloOnRoaXMueXIoYSl9LHlyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56cjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmc6YX19fSkoYyk7dmFyIG9iPWMuSGh8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLAoibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj0kYy5rcig0KTt2YXIgeD17a2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsa2E6IlhNTF9QQVJTRV9FUlJPUiJ9LG5oOnt0eXBlOiJlcnJvciIsY29kZToyMDIsbWVzc2FnZToiVmlkZW8gcGxheWVyIGV4cGVjdGluZyBkaWZmZXJlbnQgZHVyYXRpb24uIixrYToiRFVSQVRJT05fRVJST1IifSxnYzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzLG1lc3NhZ2U6Ik5vIGFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzLiBBbHNvIGluY2x1ZGVzIG51bWJlciBvZiBlbXB0eSBWQVNUIHJlc3BvbnNlcyBmcm9tIGZhbGxiYWNrLiIsa2E6IkVNUFRZX1ZBU1QifSxDZTp7dHlwZToiY3JpdGljYWwiLGNvZGU6MzAyLG1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIiwKa2E6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LHplOnt0eXBlOiJlcnJvciIsY29kZTozMDEsbWVzc2FnZToiVGltZW91dCBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBXcmFwcGVyIGVsZW1lbnQsIG9yIG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIGEgc3Vic2VxdWVudCBXcmFwcGVyIGVsZW1lbnQuIEluY2x1ZGVzIHJlcXVlc3QgZXJyb3JzIHN1Y2ggYXMgaW52YWxpZCBVUkksIHVucmVhY2hhYmxlIG9yIHJlcXVlc3QgdGltZW91dCBmb3IgVVJJLCBhbmQgc2VjdXJpdHkgb3Igb3RoZXIgZXhjZXB0aW9ucyByZWxhdGVkIHRvIHJlcXVlc3RpbmcgYSBWQVNUIFVSSS4iLGthOiJMT0FEX0VSUk9SIn0saGQ6e3R5cGU6ImVycm9yIixjb2RlOjQwMyxtZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sCnB1Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLGthOiJNRURJQUZJTEVfRVJST1IifSx2ZTp7dHlwZToiZXJyb3IiLGNvZGU6OTk5LG1lc3NhZ2U6IjEgc2VjIGR1bW15IGFkIixrYToiRFVNTVlfQUQifX0sQz17QWU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzEsbWVzc2FnZToibm8gYWRzIixrYToiTk9fQURTIn0sQmU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzIsbWVzc2FnZToibm8gbWVkaWFmaWxlcyBzcGVjaWZpZWQiLGthOiJOT19NRURJQUZJTEVTIn0scnU6e3R5cGU6ImVycm9yIixjb2RlOjMwMzMsbWVzc2FnZToibm8gcGxheWFibGUgbWVkaWFmaWxlcyIsa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMubnI9dGhpcy5hWzFdO3RoaXMudHE9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbM119Yy5hcj1iO2IucHJvdG90eXBlPXttcjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm5yOnRoaXMuc3EoYSl9LHNxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy50cTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmc6YX19fSkoYyk7dmFyIHBiPWMuYXJ8fHBiLGFkPW5ldyBwYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWFkLm1yKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5LaD1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMuS2h8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy5naz10aGlzLmFbOF07dGhpcy5MbD10aGlzLmFbNV07dGhpcy5Vbj10aGlzLmFbMTBdO3RoaXMuZW49dGhpcy5hWzldO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuZz10aGlzLmFbMl19Yy5Maz1iO2IucHJvdG90eXBlPXtmazpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZ2s6dGhpcy5LbChhKX0sS2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxsOnRoaXMuVG4oYSl9LFRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Vbjp0aGlzLmRuKGEpfSxkbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZW46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkpwOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy5Ma3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CndpbmRvdy52PWJkLmZrKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMudGg9YjtiLnByb3RvdHlwZT17Z2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLiRwKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PQp3aW5kb3cucGFnZVlPZmZzZXQ/d2luZG93LnBhZ2VZT2Zmc2V0Oihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2g9e3g6Yix5OmN9O2UmJihoLnBvc2l0aW9uPWUpO3JldHVybiBofSxMczpmdW5jdGlvbigpe3RoaXMuSWY9ITB9LHlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9CiJhZFhkaXNwbGF5Iix0aGlzLkMuc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sVmY6ZnVuY3Rpb24oKXt0aGlzLnUucGF1c2UoKTtmLkQobC55Yyx0aGlzLnUuQigpKX0sWnI6ZnVuY3Rpb24oKXt0aGlzLklmfHwodGhpcy51LnBsYXkoKSxmLkQobC56Yyx0aGlzLnUuQigpKSl9LGNjOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLnUucGF1c2UoKTt0aGlzLkcuc3R5bGUuekluZGV4PWE7dGhpcy5HLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuRy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5HLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5HLnN0eWxlLmJveFNpemluZz10aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKwoicHgiO3RoaXMuQy5zdHlsZS53aWR0aD10aGlzLlFhLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PXRoaXMuUWEub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuUWEpO3RoaXMudS5EYiYmdGhpcy51LkRiKCk/dGhpcy51LmdmKCkuYXBwZW5kQ2hpbGQodGhpcy5HKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuRyk7d2luZG93LnNldFRpbWVvdXQodGhpcy51Zi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLnUuZXhpdEZ1bGxzY3JlZW4oKX0sJHA6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LGdwOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLmdldFBvc2l0aW9uKGEpO2IucG9zaXRpb24/Yi5wb3NpdGlvbj1iLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LHVmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ3AodGhpcy5RYSk7aWYoYi54IT10aGlzLlJhLnh8fGIueSE9dGhpcy5SYS55fHxiLnBvc2l0aW9uIT10aGlzLlJhLnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLlJhLndpZHRofHxiLmhlaWdodCE9dGhpcy5SYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5SYS53aWR0aCYmMDx0aGlzLlJhLmhlaWdodCYmMD09Yi53aWR0aCYmMD09Yi5oZWlnaHQpe3RoaXMuc2YoKTtyZXR1cm59dGhpcy5SYT1iO3RoaXMudS5EYigpPyh0aGlzLkcuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPQpiLndpZHRoKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuRy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuQy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5DLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLnZmLmxlbmd0aDthKyspdGhpcy52ZlthXSh7d2lkdGg6Yi53aWR0aCxoZWlnaHQ6Yi5oZWlnaHR9KX13aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxzZjpmdW5jdGlvbigpe3RoaXMuRyYmdGhpcy5HLnBhcmVudE5vZGUmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkcpO3RoaXMuQyYmdGhpcy5DLnBhdXNlJiZ0aGlzLkMucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBOPWMudGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0KImJsb2NrIjtMLmlkPWYucGEoMTApO0wuY29udHJvbHM9ITA7Qi5wdXNoKEwpfXZhciBIPSExLFk9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixBKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5vbz10aGlzLmFbOF07dGhpcy4kZz10aGlzLmFbMTBdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuQW09dGhpcy5hWzEwXTt0aGlzLkVtPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzhdfWMuZXQ9YjtiLnByb3RvdHlwZT17bm86ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLm9vOnRoaXMuWmcoYSl9LFpnOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy4kZzp0aGlzLnZzKGEpfSwKdnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLndzOnRoaXMuem0oYSl9LHptOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQW06dGhpcy5EbShhKX0sRG06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkVtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgc2I9Yy5ldHx8c2IsY2Q9bmV3IHNiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Y2Qubm8oNCk7KGZ1bmN0aW9uKGMpe2MuVWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKTthfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpOwp0aGlzLk8oYSk7dGhpcy5mZShiKTt0aGlzLlhlKCl9LGZlOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxYZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuQ2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlIoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlhlKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGpiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nJiZiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKcmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sQjpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuQ2EoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciB0Yj1jLlVqfHx0YjsoZnVuY3Rpb24oYyl7Yy5Uaj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9WigpO3RoaXMudWI9dGhpcy51Ynx8ITE7dGhpcy5HZT10aGlzLkplPXRoaXMuemY9dGhpcy5pYT10aGlzLm1lPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLApiKXt0aGlzLlhvKGEsYil9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5tZT0hMDt0aGlzLnpmJiZ0aGlzLlJlKCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZmI7YSYmYS5ZYiYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2EubWIuc3Vic2NyaWJlKGIuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRjKCk7dGhpcy56Zj0hMDt0aGlzLlJlKCl9LmJpbmQodGhpcykpO3RoaXMuTmUoKX0sUmU6ZnVuY3Rpb24oKXtpZighdGhpcy51Yil7dGhpcy50YygpO2lmKCF0aGlzLm1lJiYhdGhpcy50YygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwKMTAwKSwhMDt0aGlzLm1lJiZ0aGlzLkdlJiYhdGhpcy5KZSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19LHRjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBiJiZiLmFkTWFuYWdlcnMmJmIuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxtZjpmdW5jdGlvbihiKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxhLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9YS5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWIpcmV0dXJuIGQuaW5zdGFuY2V9fSxOZTpmdW5jdGlvbigpe2lmKHRoaXMudGMoKSl7dmFyIGI9dGhpcy5tZigiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLkplPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuR2U9Yi53dX10aGlzLmhhKCl8fAp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmUoKX0uYmluZCh0aGlzKSwxMDApfSxEdTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNBZFBsYXlpbmc/Yi5RdSgpOiExfSxVYjpmdW5jdGlvbihiKXtyZXR1cm4gYi5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRBZER1cmF0aW9uP2IuVWIoKTotMX0sb3A6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmc/Yi5pc1BsYXlpbmcoKTotMX0sWG86ZnVuY3Rpb24oYixhKXt0aGlzLnViPWEubWF0Y2goL1xkKy8pP3BhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMudWJ8fDMwMj09dGhpcy51Yj90aGlzLmlhPSEwOnRoaXMubCgiYWRlcnJvciIsdGhpcy51Yik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX0seGM6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPyh0aGlzLm0oKSx0aGlzLm5hKCkpOmIuTmMoKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5vcChiKT8odGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnhjKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciB1Yj1jLlRqfHx1YjsoZnVuY3Rpb24oYyl7Yy5Waj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGhxOmZ1bmN0aW9uKCl7d2luZG93Lk9PLnJrLldsLlVsP3dpbmRvdy5PTy5yay5XbC5VbC51dShmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ocSgpfSwxMDApfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO3ZhciBiPVooKTtpZihiJiZiLl9faW50ZXJuYWwmJgpiLl9faW50ZXJuYWwucGxheWVycyYmMDxmLkRhKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyB0YihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgdWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIHZiPWMuVmp8fHZiLHdiPW5ldyB2YihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NcT10aGlzLmFbOF07dGhpcy5Ibj10aGlzLmFbNV07dGhpcy5DbT10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbMl07dGhpcy5Pcz10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs3XX1jLlZpPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLkduKGEpfSwKR246ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkhuOnRoaXMuQm0oYSl9LEJtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5DbTp0aGlzLmJ1KGEpfSxidTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY3U6dGhpcy5OcyhhKX0sTnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLk9zOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy5WaXx8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQuTHEoNCk7KGZ1bmN0aW9uKGMpe2MuVWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07CmF8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX0sRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5Va3x8eWI7KGZ1bmN0aW9uKGMpe2MuVGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpOwp5LnFkKCIjIitiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJhZHNNYW5hZ2VyTG9hZEZhaWwiKTt0aGlzLncoKX0uYmluZCh0aGlzKSwxRTMpfS5iaW5kKHRoaXMpKTt5LnFkKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuYnIoYSl9LmJpbmQodGhpcykpO3kuQ3AoKX0sYnI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7CnRoaXMubmEoKTtyZXR1cm59fXRoaXMubCgiYWRlcnJvciIsYSk7dGhpcy53KCl9fSl9KShjKTt2YXIgemI9Yy5Ua3x8emI7KGZ1bmN0aW9uKGMpe2MuVms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuJG4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9CltdKTt0aGlzLlNjLnB1c2goYlthXSk7dmFyIGU9bmV3IHliKGQpO3RoaXMuSShlKXx8KHRoaXMuTChlKSwobmV3IHpiKGUsdGhpcy5BKSkuYigpKX1jYXRjaChoKXt9fX10aGlzLkgoKX0scWQ6ZnVuY3Rpb24oYixhLGMpe3RoaXMuWnx8KHRoaXMuWj17fSk7dGhpcy5aW2JdfHwodGhpcy5aW2JdPXt9KTt0aGlzLlpbYl1bYV18fCh0aGlzLlpbYl1bYV09W10pO3RoaXMuWltiXVthXS5wdXNoKGMpfSxidDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMuWHIoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSwKQ3A6ZnVuY3Rpb24oKXtpZih0aGlzLiRiKWZvcih2YXIgYj0wO2I8dGhpcy4kYi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLiRiW2JdLGM9YS5zUGxheWVyU2VsZWN0b3IsZD0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5aW2NdW2RdJiYwPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LmJ0KGIpfX0pfSkoYyk7dmFyIEFiPWMuVmt8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Gaj0KdGhpcy5hWzNdO3RoaXMub3U9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5taD1iO2IucHJvdG90eXBlPXtFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5udShhKX0sbnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm91OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgQmI9Yy5taHx8QmIsZWQ9bmV3IEJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZWQuRWooNCk7KGZ1bmN0aW9uKGMpe2MuZ2g9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKYXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0samI6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSl9LGhiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBDYj1jLmdofHxDYjsoZnVuY3Rpb24oYyl7Yy5oaD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkNyfHwodGhpcy5Dcj0hMCx3aW5kb3cuU21hcnRBZFNlcnZlckFTTUl8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiU21hcnRBZFNlcnZlciIpLHRoaXMudygpKSl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgRGI9Yy5oaHx8RGI7KGZ1bmN0aW9uKGMpe2MuaWg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTsKaWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9YlthXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgZj1uZXcgQ2IoZCk7dGhpcy5JKGYpfHwodGhpcy5MKGYpLChuZXcgRGIoZix0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319dGhpcy5IKCl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy54YSlpZihhPT10aGlzLnhhW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLnhhW2IuZWIoKV0/ITA6ITF9fSl9KShjKTt2YXIgRWI9Yy5paHx8RWIsRmI9bmV3IEViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Maj10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbM107dGhpcy5NaD10aGlzLmFbMTBdO3RoaXMuYmo9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbM119Yy5Fbz1iO2IucHJvdG90eXBlPXtLajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuTGo6dGhpcy5ZbihhKX0sWW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlpuOnRoaXMuTGgoYSl9LExoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5NaDp0aGlzLmFqKGEpfSxhajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuYmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBHYj1jLkVvfHxHYixmZD1uZXcgR2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1mZC5Laig0KTsKKGZ1bmN0aW9uKGMpe2MueWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYKMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLnlsfHxIYjsoZnVuY3Rpb24oYyl7Yy54bD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLDEwMCk7dGhpcy5ab3x8KHRoaXMuQWYoKSx0aGlzLlpvPSEwKTtiJiZiLmlkJiYwPGIuaWQuaW5kZXhPZigiYWQiKT90aGlzLm0oKTp0aGlzLkxlPyh0aGlzLmwoImFkZXJyb3IiLCJub0NvbnRhaW5lciIpLHRoaXMubygpKToodGhpcy5MZT0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLAo1MDApKX0sY3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5jcCgpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5vKCksdGhpcy5sKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZigpfS5iaW5kKHRoaXMpLDUwKX0sT3U6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBJYj1jLnhsfHxJYjsoZnVuY3Rpb24oYyl7Yy56bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5MKGMpLChuZXcgSWIoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEpiPWMuemx8fEpiLEtiPW5ldyBKYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5TbT10aGlzLmFbOF07dGhpcy5RcD10aGlzLmFbN107dGhpcy5SbD10aGlzLmFbN107dGhpcy5VcD10aGlzLmFbMTBdOwp0aGlzLiRrPXRoaXMuYVs1XTt0aGlzLmJsPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuVmc9YjtiLnByb3RvdHlwZT17Um06ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlNtOnRoaXMuUHAoYSl9LFBwOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5RcDp0aGlzLlFsKGEpfSxRbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUmw6dGhpcy5UcChhKX0sVHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlVwOnRoaXMuWmsoYSl9LFprOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kazp0aGlzLmFsKGEpfSxhbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuYmw6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLlZnfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LnY9Z2QuUm0oNCk7KGZ1bmN0aW9uKGMpe2MuaGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYoMCx0aGlzLkopKCEwKX0uYmluZCh0aGlzKSl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ia2FsdHVyYSJ9fSl9KShjKTsKdmFyIE1iPWMuaGp8fE1iOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMuZ20oKX0uYmluZCh0aGlzKSksdGhpcy5KZz0hMSx0aGlzLlN0PQoxRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLlN0KSl9LGdtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmYltjXVtkXS5nZXRFcnJvckNvZGUpe3ZhciBlPWJbY11bZF07YltjXVtkXS5nZXRFcnJvckNvZGUoKTsKYltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy5nanx8TmI7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKXx8CndpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpO3ZhciBPYj1jLmlqfHxPYixQYj1uZXcgT2IocSk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZoPXRoaXMuYVs5XTt0aGlzLmxxPXRoaXMuYVs1XTt0aGlzLnloPXRoaXMuYVsxMF07dGhpcy5KaD10aGlzLmFbN107dGhpcy5PcD10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs4XX1jLlNxPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52aDp0aGlzLmtxKGEpfSxrcTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMubHE6dGhpcy54aChhKX0seGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnloOnRoaXMuSWgoYSl9LEloOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5KaDp0aGlzLk5wKGEpfSxOcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuT3A6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBRYj1jLlNxfHxRYixoZD1uZXcgUWIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQudWgoNCk7KGZ1bmN0aW9uKGMpe2MuTms9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iU2ltcGxlVmlkZW9BbmRJbWEifX0pfSkoYyk7dmFyIFJiPWMuTmt8fFJiOyhmdW5jdGlvbihjKXtjLk1rPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXtiLmRldGFpbCYmYi5kZXRhaWwuZ2V0RXJyb3I/KGI9Yi5kZXRhaWwuZ2V0RXJyb3IoKSsiIixiLmluZGV4T2YmJjA8Yi5pbmRleE9mKCIxMDA5Iik/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKSk6KHRoaXMubCgiYWRlcnJvciIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk7dGhpcy5QYigpfSxQYjpmdW5jdGlvbigpe3dpbmRvdy5pbWEmJmltYS52aWRlbyYmaW1hLnZpZGVvLmNsaWVudD90aGlzLkdkKCkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HZCgpJiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0uYmluZCh0aGlzKSw1MDApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLAoxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBTYj1jLk1rfHxTYjsoZnVuY3Rpb24oYyl7Yy5Paz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfU1VCU0lURSYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9DT05URU5UJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1dFUkJVTkcmJjE9PWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLmxlbmd0aCYmCiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIFRiPWMuT2t8fFRiLFViPW5ldyBUYihxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbMTBdO3RoaXMuSmk9dGhpcy5hWzVdO3RoaXMuUG09dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbOF19Yy4kcj1iO2IucHJvdG90eXBlPXtFaTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuRmk6dGhpcy5JaShhKX0sSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkppOnRoaXMuT20oYSl9LE9tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5QbTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOgphfX19KShjKTt2YXIgVmI9Yy4kcnx8VmIsaWQ9bmV3IFZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aWQuRWkoNCk7KGZ1bmN0aW9uKGMpe2MuRWs9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLk8oYik7dGhpcy5SKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuV2Q9ITF9LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkZyKCl9LmJpbmQodGhpcyksNTAwKX0sRnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBvc2l0aW9uKCksYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJgpiPj1hLTEmJnRoaXMuSiYmdGhpcy5KKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXREdXJhdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXREdXJhdGlvbigpKTtyZXR1cm4gYX0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYT1iLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBhfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuV2QmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuV2QpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBsYXliYWNrJiZiLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwKInBsYXlpbmciPT1iLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpKTohMX0sSHM6ZnVuY3Rpb24oKXt0aGlzLldkPXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMucGF1c2UoKX0uYmluZCh0aGlzKSwxMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUm9ja2VyeSJ9fSl9KShjKTt2YXIgV2I9Yy5Fa3x8V2I7KGZ1bmN0aW9uKGMpe2MuRGs9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKTt0aGlzLktiPTB9LGI6ZnVuY3Rpb24oKXt0aGlzLk5xPTEwO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5LYnx8KHRoaXMuS2I9MCxiLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIik7dGhpcy5vKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZT8od2luZG93LnZpZGVvcGxhemEuY29yZS5BZENhbGxNb2R1bGV8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLlRyYWNrZXJ8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSk6KHRoaXMuS2J8fHRoaXMuS2IrKyx0aGlzLktiPD10aGlzLk5xPyh0aGlzLktiKyssd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKToodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpfSxvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5IcygpLHRoaXMudygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgWGI9Yy5Ea3x8WGI7KGZ1bmN0aW9uKGMpe2MuRms9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxhPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiYKYVswXSYmd2luZG93LnBsYXllckFwaSYmd2luZG93LnBsYXllckFwaS5wbGF5YmFjayYmYiYmKGI9bmV3IFdiKHdpbmRvdy5wbGF5ZXJBcGkpLHRoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFhiKGIsdGhpcy5BKSkuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgWWI9Yy5Ga3x8WWIsWmI9bmV3IFliKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVsxXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLkRpPXRoaXMuYVs5XTt0aGlzLlFzPXRoaXMuYVsxMF07dGhpcy4kaj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVs0XX1jLkJoPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nbjp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVGg6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkRpOgp0aGlzLlBzKGEpfSxQczpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUXM6dGhpcy5aaihhKX0sWmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLiRqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgJGI9Yy5CaHx8JGIsamQ9bmV3ICRiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9amQuZm4oNCk7KGZ1bmN0aW9uKGMpe2Muems9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5PKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlIoYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPQohMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPSIiO2IuY3VycmVudFRpbWUmJihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxlYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLkooKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWEoKX0uYmluZCh0aGlzKSwyMDApfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgYWM9Yy56a3x8YWM7KGZ1bmN0aW9uKGMpe2MueWs9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLkNhKCk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5ObigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yj10aGlzLkljKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5CcSgpOnRoaXMuUGIoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuRmUoKXx8KHRoaXMubCgiY29udGVudHBsYXkiKSx0aGlzLm8oITApKX0uYmluZCh0aGlzKSwxRTMpfSxObjpmdW5jdGlvbigpe3RoaXMuRmUoKXx8dGhpcy5vKCEwKX0sQnE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5JYygpOyFiLm1hJiZiLmJhJiZiLnR1JiZiLnZ1JiYodGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMubygpKX0sUGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkljKCk7Yi5hZHNMb2FkZXI/Yi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBiO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihiIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2JdKXtiPWFbYl07YnJlYWsgYX1iPXZvaWQgMH0xMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj8odGhpcy5tKCksdGhpcy5uYSgpKToodGhpcy5sKCJhZGVycm9yIixiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QYigpfS5iaW5kKHRoaXMpLDEwMCl9LEljOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWsucGxheWVyYXBpKCksYT10aGlzLmdldFBsYXllcigpLkNhKCkuaWQsYz0wO2M8Yi5sZW5ndGg7YysrKWlmKGJbY10uaWQ9PQphKXJldHVybiBiW2NdO3JldHVybnt9fSxHZDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxvOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5JYygpLmFkc0xvYWRlcj90aGlzLncoITApOnRoaXMudygpOnRoaXMudygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBiYz1jLnlrfHxiYzsoZnVuY3Rpb24oYyl7Yy5Baz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZihrJiZrLnBsYXllcmFwaSlmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBhYyhkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IGJjKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBjYz1jLkFrfHxjYyxkYz1uZXcgY2MocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzFdO3RoaXMuQ2s9dGhpcy5hWzRdO3RoaXMuRGg9dGhpcy5hWzZdO3RoaXMud3E9dGhpcy5hWzldO3RoaXMubGg9dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbNF19Yy5ibz1iO2IucHJvdG90eXBlPXtGaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuR2g6dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkNrOnRoaXMuQ2goYSl9LENoOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5EaDp0aGlzLnZxKGEpfSx2cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMud3E6dGhpcy5raChhKX0sa2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIGVjPWMuYm98fGVjLGtkPW5ldyBlYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWtkLkZoKDQpOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtEJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuTyhiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5SKGEpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sCnBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sSzpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sRGI6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sQ2E6ZnVuY3Rpb24oKXt2YXIgYjtEPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmCih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgVD1jLnJqfHxUOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlhkPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuWGQ9Yi5pZCk7RD93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5YZCYmYiE9dGhpcy5YZHx8ImFkZXJyb3IiIT1hLmV2ZW50fHwoYS5hZFVSTCYmKGsuYWRUYWc9YS5hZFVSTCksdGhpcy5sKCJhZGVycm9yIixhLlN1KSx0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSwic3ZtIik6d2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2V0TGlzdGVuZXIoZnVuY3Rpb24oYSl7ImFkZXJyb3IiPT0KYSYmKHRoaXMubCgiYWRlcnJvciIpLHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBVPWMucWp8fFU7KGZ1bmN0aW9uKGMpe2Muc2o9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9wbGF5JiZ3aW5kb3cuX3BsYXkuYWRkb25zJiZ3aW5kb3cuX3BsYXkuYWRkb25zLnN2bSl7RD0iZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyPyExOiEwO3ZhciBiO2lmKEQpZm9yKHZhciBhPXdpbmRvdy5fcGxheS5jb250cm9sLmdldEluc3RhbmNlcygpLGM9YS5sZW5ndGgsZD0wO2Q8YztkKyspe2lmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYVtkXSkpYj1uZXcgVChiKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgVShiLHRoaXMuQSksYi5iKCkpfWVsc2UgaWYoYj0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9bmV3IFQoYiksYi5qYT90aGlzLmNnKCk6dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBELGZjPWMuc2p8fGZjLGdjPW5ldyBmYyhmdW5jdGlvbihjLGIpe2MucGF1c2UoKTtpZihtLm5iLmxlbmd0aCl7dmFyIGE9bS5uYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBnO2c9Zi5wcyh7IltMT0FEU0NSSVBUXSI6Zi5wYSgxMCksIltVVElMU10iOmYucGEoMTApLCJbQ0FMTEJBQ0tdIjpmLnBhKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09Zi5NZi5iaW5kKGYpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgZSBpbiBhKWtbZV09YVtlXTtxKGMsYil9O2c9YS5zY3JpcHRzLnNoaWZ0KCk7KWYuTWYoZywKZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSBxKGMsYil9ZWxzZSBxKGMsYil9KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Obz10aGlzLmFbNV07dGhpcy5Fcz10aGlzLmFbOV07dGhpcy5tbz10aGlzLmFbMV07dGhpcy56aj10aGlzLmFbM107dGhpcy5pbz10aGlzLmFbMV07dGhpcy5Jaz10aGlzLmFbOF07dGhpcy5QcT10aGlzLmFbOF07dGhpcy5QbD10aGlzLmFbM107dGhpcy5maj10aGlzLmFbMl07dGhpcy5nPXRoaXMuYVsyXX1jLnRpPWI7Yi5wcm90b3R5cGU9e01vOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Obzp0aGlzLkRzKGEpfSxEczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRXM6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5tbzp0aGlzLnlqKGEpfSx5ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuemo6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlvOnRoaXMuSGsoYSl9LEhrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Jazp0aGlzLk9xKGEpfSxPcTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUHE6dGhpcy5PbChhKX0sT2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBsOnRoaXMuZWooYSl9LGVqOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5majp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIGhjPWMudGl8fGhjLGxkPW5ldyBoYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PWxkLk1vKDQpOyhmdW5jdGlvbihjKXtjLmdsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sCk46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuTyhhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlIoYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLlRxPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfWVsc2UgdGhpcy5kYSgpfSxnczpmdW5jdGlvbihiKXt0aGlzLm5kPWJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSwKZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UcX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sSzpmdW5jdGlvbigpe3JldHVybiJ0djIifSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5wYihiKX0uYmluZCh0aGlzKSl9LHBiOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJih0aGlzLkomJnRoaXMuSigpLHRoaXMubmQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLm5kJiYobmV3IEcodGhpcyx0aGlzLm5kKSkuYigpKX19KX0pKGMpO3ZhciBNPWMuZ2x8fE07KGZ1bmN0aW9uKGMpe2MuZmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYiwKYSl9LFZhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5BZClpZih0aGlzLmdifHwodGhpcy5nYj0wKSx0aGlzLmdiKyssMTU8dGhpcy5nYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHRoaXMucnMoKSwhMDt0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm8oKTp0aGlzLm8oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5BZD0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJgooYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwxMCl9LHZhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWF9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuVT1hLGIubCgiYWRlcnJvciIsYSkpOmIubCgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTsKaWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLlZhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxvOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMudyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubyhiKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIEc9Yy5mbHx8RzsoZnVuY3Rpb24oYyl7Yy5obD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYik7dGhpcy53YT0tMX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGI9bmV3IE0od2luZG93Lmluc2VydGVkUGxheWVyKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE0od2luZG93LlRWMlBsYXllcnNbYV0pLGIuamF8fHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmCihiPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYi5ncyh0aGlzLkEpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgaWM9Yy5obHx8aWMsamM9bmV3IGljKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm11PXRoaXMuYVsxXTt0aGlzLm5uPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzJdfWMudG89YjtiLnByb3RvdHlwZT17bHU6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm11OnRoaXMubW4oYSl9LG1uOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ubjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGtjPWMudG98fGtjLG1kPW5ldyBrYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsCiExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1tZC5sdSg0KTsoZnVuY3Rpb24oYyl7Yy5vaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZHVyYXRpb249dGhpcy5VZT0wO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pO2E/dGhpcy5SKGEpOnRoaXMuZGEoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmRhdGEoKX0uYmluZCh0aGlzKSw1MDApfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5QQVVTRSwKe2lkOmIuaWR9KX0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5mYWNhZGUuc2VuZE5vdGlmaWNhdGlvbih3aW5kb3cubXZwLlBsYXllckZhY2FkZS5SRVNVTUUse2lkOmIuaWR9KX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpO3RoaXMuZ2V0RHVyYXRpb24oKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYyPnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sZGF0YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CmIuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX1RJTUUse3JuOmZ1bmN0aW9uKGEpezA8YSYmKHRoaXMuVWU9YSl9LmJpbmQodGhpcyksaWQ6Yi5pZH0pO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuR0VUX0RBVEEse3JuOmZ1bmN0aW9uKGEpezA8YS5kdXJhdGlvbiYmKHRoaXMuZHVyYXRpb249YS5kdXJhdGlvbil9LmJpbmQodGhpcyksaWQ6Yi5pZH0pfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIm12cCJ9fSl9KShjKTt2YXIgbGM9Yy5vanx8bGM7KGZ1bmN0aW9uKGMpe2Mubmo9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sV3U6ZnVuY3Rpb24oKXt9LFJyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5mYWNhZGUsYTthPW5ldyBtdnAudWUobmV3IGZ1bmN0aW9uKCl7fSk7YS5xdT0iSE9NQURfTUVESUFUT1IiO2E9bmV3IGE7Yi5ScihhKTsKd2luZG93Lnl1PWJ9LGI6ZnVuY3Rpb24oKXt0aGlzLlFyfHwodGhpcy5Rcj0hMCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkRkfHwodGhpcy5EZD0xKTtpZigyMDx0aGlzLkRkKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGE9ITEsYz1hPSExO2lmKGIuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYoYT1iLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yKCJWaWRlb1NjcmVlbk1lZGlhdG9yXyIrYi5pZCkpJiZhLmdldFZpZXdDb21wb25lbnQmJihhPWEuZ2V0Vmlld0NvbXBvbmVudCgpKSYmYS5fc2NyZWVuQ2xpZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEmJihjPWEuX3NjcmVlbkNsaWVudC5fZWxlbWVudC5pbWEuX2Fkc0xvYWRlcikpe3RoaXMuSGEoYyxhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hKTtyZXR1cm59dGhpcy5EZCsrOwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwKX19LEhhOmZ1bmN0aW9uKGIpe3ZhciBhPSJhZEVycm9yIixjPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudCYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihjPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmCmIubCgiYWRlcnJvciIsYSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9ITEsYz1hPSExO2IuZmFjYWRlJiZiLmZhY2FkZS5yZXRyaWV2ZU1lZGlhdG9yJiYKKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNNYW5hZ2VyKTtiPSJhZEVycm9yIjthPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJgooYT1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpO2MuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKX0uYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMuVyghMCl9LmJpbmQodGhpcykpfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIG1jPWMubmp8fG1jOyhmdW5jdGlvbihjKXtjLnBqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5tdnAmJndpbmRvdy5tdnAuUGxheWVyRmFjYWRlJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSlmb3IodmFyIGI9CmRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm12cCIpLGE9MDthPGIubGVuZ3RoO2ErKylpZihiW2FdLmlkKXt2YXIgYz1uZXcgbGMoe2lkOmJbYV0uaWQsZmFjYWRlOndpbmRvdy5tdnAuUGxheWVyRmFjYWRlLmdldEluc3RhbmNlKCl9KTtjLmphfHx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBtYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgbmM9Yy5wanx8bmMsb2M9bmV3IG5jKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmpuPXRoaXMuYVs0XTt0aGlzLnRtPXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzhdfWMuRWg9YjtiLnByb3RvdHlwZT17TW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLk5tOnRoaXMuaG4oYSl9LGhuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qbjp0aGlzLnNtKGEpfSwKc206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnRtOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgcGM9Yy5FaHx8cGMsbmQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bmQuTW0oNCk7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKTthJiZ0aGlzLk8oYS5wYXJlbnROb2RlKX0sSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFY9Yy5sanx8VjsoZnVuY3Rpb24oYyl7Yy5raj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy53Zj0wO3RoaXMuVT10aGlzLlV8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT10aGlzLlhiPXRoaXMuVmE9dGhpcy5xYz0hMTt0aGlzLmFnPWYua2IoMTApO3RoaXMuRmYoKX0sRmY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubWE9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm8oITApOnRoaXMubygpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRmYuYmluZCh0aGlzKSwxMDApLCExfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj8Kd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSwKdGhpcy5uYSgpKTp0aGlzLm8oYil9LmJpbmQodGhpcyksMTAwKX0sbzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBXPWMua2p8fFc7KGZ1bmN0aW9uKGMpe2MubWo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ITE7aWYod2luZG93LmwxUGxheWVySW5zdGFuY2UmJndpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aCYmMDx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFYod2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7CmVsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBWKHdpbmRvdy5wbGF5ZXIpLHRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIHFjPWMubWp8fHFjLHJjPW5ldyBxYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5VZz10aGlzLmFbNF07dGhpcy5waD10aGlzLmFbNV07dGhpcy5sbD10aGlzLmFbMl07dGhpcy5Eaj10aGlzLmFbOV07dGhpcy5laT10aGlzLmFbMV07dGhpcy5Sbz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs1XX1jLmtpPWI7Yi5wcm90b3R5cGU9e1RnOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VZzp0aGlzLm9oKGEpfSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMucGg6dGhpcy5rbChhKX0sa2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5sbDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuRGo6dGhpcy5kaShhKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmVpOnRoaXMuUW8oYSl9LFFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Sbzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNjPWMua2l8fHNjLG9kPW5ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PW9kLlRnKDQpOyhmdW5jdGlvbihjKXtjLlFoPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yj8oYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLnBsYXllclByZWZpeCkpPyh0aGlzLk8oYiksKGI9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk/CnRoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKTp0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpJiZiLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuaXNQbGF5aW5nKCl8fGIucGxheSgpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXk/Yi5hdXRvcGxheTohMX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4idW5kZWZpbmVkIj09PXR5cGVvZiBiLmlzUGF1c2VkPyExOmIuaXNQYXVzZWQ/ITE6ITB9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaXNGdWxsc2NyZWVuP2IuaXNGdWxsc2NyZWVuOiExfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7CnJldHVybiBiLnZpZGVvaW5mby5kdXJhdGlvbj9iLnZpZGVvaW5mby5kdXJhdGlvbjowfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIudmlkZW9pbmZvLnBsYXloZWFkP2IudmlkZW9pbmZvLnBsYXloZWFkOjB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy50cEV4aXRGdWxsc2NyZWVuJiZ3aW5kb3cudHBFeGl0RnVsbHNjcmVlbigpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIkZPWE5FT1BsYXllciJ9fSl9KShjKTt2YXIgdGM9Yy5RaHx8dGM7KGZ1bmN0aW9uKGMpe2MuUGg9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFMb2FkU3RhcnQiLGZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFTdGFydCIsCmZ1bmN0aW9uKCl7fSk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhU3RhcnQiLHRoaXMudGVzdCk7JHBkay5jb250cm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoIk9uTWVkaWFQbGF5aW5nIix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbkNsZWFyQ3VycmVudFJlbGVhc2UiLHRoaXMudGVzdCk7d2luZG93LkZETV9QbGF5ZXJfdmFycy5hZHBkZXRlY3RlZCYmKHRoaXMubCgiYWRlcnJvciIsInVzaW5nQWRCbG9ja2luZ1NvZnR3YXJlIiksdGhpcy5vKCkpfSx0ZXN0OmZ1bmN0aW9uKCl7fSxvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtiLmlzUGxheWluZygpPyhiLnBhdXNlKCksdGhpcy53KCkpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgdWM9Yy5QaHx8dWM7KGZ1bmN0aW9uKGMpe2MuUmg9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dGhpcy53YT0xNTAwO2lmKHdpbmRvdy5GT1hORU9fUGxheWVyJiZ3aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzJiYwPGYuRGEod2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycykpZm9yKHZhciBiPXdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMsYT1iLmxlbmd0aCxjPTA7YzxhO2MrKyl7dmFyIGQ9YltjXTtpZihkLnZhcnMuaXNSZWFkeSlkPW5ldyB0YyhkKSxkLmphfHx0aGlzLkkoZCl8fCh0aGlzLkwoZCksKG5ldyB1YyhkLHRoaXMuQSkpLmIoKSk7ZWxzZSBicmVha310aGlzLkgoKX19KX0pKGMpO3ZhciB2Yz1jLlJofHx2Yyx3Yz1uZXcgdmMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT0KQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkJsPXRoaXMuYVsxMF07dGhpcy54az10aGlzLmFbM107dGhpcy5XbT10aGlzLmFbM107dGhpcy5jbj10aGlzLmFbOF07dGhpcy5raz10aGlzLmFbM107dGhpcy50bj10aGlzLmFbNV07dGhpcy5ZbD10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs0XX1jLnZyPWI7Yi5wcm90b3R5cGU9e0FsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5CbDp0aGlzLndrKGEpfSx3azpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueGs6dGhpcy5WbShhKX0sVm06ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldtOnRoaXMuYm4oYSl9LGJuOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5jbjp0aGlzLmprKGEpfSxqazpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMua2s6dGhpcy5zbihhKX0sc246ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRuOnRoaXMuWGwoYSl9LFhsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLllsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTt2YXIgeGM9Yy52cnx8eGMscGQ9bmV3IHhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cGQuQWwoNCk7KGZ1bmN0aW9uKGMpe2MuJGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0cnl7Yj10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsYT10aGlzLmdldFJhd1BsYXllcigpWzBdfWNhdGNoKGMpe31iJiZhPyh0aGlzLk8oYiksdGhpcy5SKGEpLHRoaXMuZ2V0UmF3UGxheWVyKCkpOnRoaXMuZGEoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKImJsb2NrIil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iR0FOVmlkZW8ifX0pfSkoYyk7dmFyIHljPWMuJGh8fHljOyhmdW5jdGlvbihjKXtjLlpoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLlBlKCl9LFBlOmZ1bmN0aW9uKGIpe3dpbmRvdy5HQU5fVmlkZW98fChiPyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZSghMCl9LmJpbmQodGhpcyksMTAwKSl9fSl9KShjKTt2YXIgemM9Yy5aaHx8emM7KGZ1bmN0aW9uKGMpe2MuYWk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihiJiYiRElWIj09Yi5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IHljKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTsKaWYoYi5qYSl7dGhpcy5IKCk7cmV0dXJufWlmKCF0aGlzLkkoYikpe3RoaXMuTChiKTsobmV3IHpjKGIsdGhpcy5BKSkuYigpO3RoaXMuSCgpO3JldHVybn19dGhpcy5IKCl9fSl9KShjKTt2YXIgQWM9Yy5haXx8QWMsQmM9bmV3IEFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkhpPXRoaXMuYVsyXTt0aGlzLkNzPXRoaXMuYVsxXTt0aGlzLnRrPXRoaXMuYVs2XTt0aGlzLmRyPXRoaXMuYVsxMF07dGhpcy5laz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs5XX1jLmpxPWI7Yi5wcm90b3R5cGU9e0dpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5IaTp0aGlzLkJzKGEpfSxCczpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuQ3M6dGhpcy5zayhhKX0sc2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRrOnRoaXMuY3IoYSl9LGNyOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMuZHI6dGhpcy5kayhhKX0sZGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5qcXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR2koNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuSGY9dGhpcy5LZj10aGlzLkpmPSExO3RoaXMuVWM9W107dGhpcy4kZD17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgQmM/bnVsbDpCYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgcmM/bnVsbDpyYyx0b25saW5lOiJ1bmRlZmluZWQiPT09dHlwZW9mIEhhP251bGw6SGEsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBDYT9udWxsOkNhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjP251bGw6amMsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeT9udWxsOnksbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBnYz9udWxsOmdjLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBGYj9udWxsOkZiLFNpbXBsZVZpZGVvQW5kSW1hOiJ1bmRlZmluZWQiPT09dHlwZW9mIFViP251bGw6VWIsbXZwOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9jP251bGw6b2MsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIHdiPwpudWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLFhPWkNPTToidW5kZWZpbmVkIj09PXR5cGVvZiB4YT9udWxsOnhhLEJDRmxhc2hPbmx5OiJ1bmRlZmluZWQiPT09dHlwZW9mIE1hP251bGw6TWEsRGVtb1ZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgbmE/bnVsbDpuYX19Yy5waz1iO2IucHJvdG90eXBlPXtiOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLnJwKGEpOltdLGI7dGhpcy5LZj0hMDtpZihhLmxlbmd0aCl7dGhpcy5KZj0hMDtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKyliPQphW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxycDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy4kZFtjXSx0aGlzLm9lKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LGRnOmZ1bmN0aW9uKGEpe3RoaXMub2UoYSkmJmEuYigpfSxKczpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcCYmIXRoaXMuSmYpZm9yKHRoaXMuSGY9ITAsYT0wO2E8dGhpcy5VYy5sZW5ndGg7YSsrKXRoaXMuVWNbYV0ucWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5VY1thXS5xYil9fX0pKGMpO3ZhciBEYz1jLnBrfHxEYyxLPW5ldyBEYztLLmIoKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuV3Q9dGhpcy5hWzRdO3RoaXMuanU9dGhpcy5hWzNdO3RoaXMuamw9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMV19Yy53bD1iO2IucHJvdG90eXBlPXtWdDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3Q6dGhpcy5pdShhKX0saXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmp1OnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qbDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEVjPWMud2x8fEVjLHJkPW5ldyBFYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXJkLlZ0KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCmZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZi5UYihsLnd0KSxmLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZi5UYihsLldxKSxmLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpOwp2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxiYT1FLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChFKTt2YXIgRj1uZXcgZ2Esaz0hMTtGLk1jKCk7Ri5CZigpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEYuTWMoKSxmdW5jdGlvbihjKXtrfHwoaz1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLkJmKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7Ri5NYygpO3ZhciB0ZD1zZChmdW5jdGlvbigpe2YuZmlyZUV2ZW50KHdpbmRvdyxGLlhwKCkse2lkOnRkfSl9LDUwMCk7YWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52bz10aGlzLmFbMV07dGhpcy5mdT10aGlzLmFbMTBdO3RoaXMueXM9dGhpcy5hWzEwXTt0aGlzLkpqPXRoaXMuYVsyXTsKdGhpcy5vdD10aGlzLmFbMTBdO3RoaXMuQmo9dGhpcy5hWzEwXTt0aGlzLklvPXRoaXMuYVsxXTt0aGlzLm5sPXRoaXMuYVs0XTt0aGlzLmFwPXRoaXMuYVs0XTt0aGlzLmRqPXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzZdfWMuTWo9YjtiLnByb3RvdHlwZT17dW86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnZvOnRoaXMuZXUoYSl9LGV1OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5mdTp0aGlzLnhzKGEpfSx4czpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXM6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Kajp0aGlzLm50KGEpfSxudDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3Q6dGhpcy5BaihhKX0sQWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkJqOnRoaXMuSG8oYSl9LEhvOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Jbzp0aGlzLm1sKGEpfSxtbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubmw6CnRoaXMuJG8oYSl9LCRvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5hcDp0aGlzLmNqKGEpfSxjajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZGo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBGYz1jLk1qfHxGYyx1ZD1uZXcgRmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj11ZC51byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmY9dGhpcy5jb25mPXRoaXMuVWE9dGhpcy5wbGF5ZXI9bnVsbDt0aGlzLlBjPTA7dGhpcy5MYT0iIjt0aGlzLlZjPVtdO3RoaXMuV2M9MDt0aGlzLiRmPSExO3RoaXMuWWQ9W119Yy5MZz1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXt0aGlzLlpmPWF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LApnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGpzOmZ1bmN0aW9uKGEpe3RoaXMuVWE9YX0saHM6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5MYV0mJnRoaXMuY29uZlt0aGlzLkxhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuTGFdW2FdKTtyZXR1cm4gYn0sYmM6ZnVuY3Rpb24oYSxiKXtmLmliKCJ3ZWx0LmRlIikmJmYuWGEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpOwp2YXIgYz0hMSxlPSExO2lmKHRoaXMuWXAoKSl0aGlzLlVhLmModGhpcy5VYS5KYyx0aGlzLlVhLnphLHRoaXMuVWEuWmQsZnVuY3Rpb24oKXt0aGlzLmJjKGEsYil9LmJpbmQodGhpcyksdGhpcy5VYS5CYyk7ZWxzZSBpZih0aGlzLkVwKCkpdGhpcy5jcyhmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2YuRChsLnljLHRoaXMucGxheWVyLkIoKSk7dmFyIGg9dGhpcy5jb25mLGs9bmV3IE4odGhpcy5nZXRQbGF5ZXIoKSxoKTtiJiZrLkxzKCk7ay5leGl0RnVsbHNjcmVlbigpO1E9az1uZXcgTyhrLHRoaXMuVWEsaCk7ay5nZyh0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfWE9dGhpcy5LcShhKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpOwpoLmFkU3RhcnRUaW1lb3V0JiYoZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30saC5hZFN0YXJ0VGltZW91dHx8NUU0KSk7ay5KZChhLGMsZSk7dGhpcy5wbGF5ZXIuaGcoayl9fSxZcDpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLlBjKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMuUGMuZ2V0VGltZSgpLHRoaXMuUGM9YSwzRTU8Yj8hMDohMTt0aGlzLlBjPWE7cmV0dXJuITF9LEFzOmZ1bmN0aW9uKCl7Zi5lZSgicHJlcm9sbCIpO3ZhciBhPXRoaXMudGEoImFkVGFnIik7dGhpcy50YSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMudGEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLmFmKGEpKT90aGlzLmJjKGEpOihzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGxheSgpfS5iaW5kKHRoaXMpLDApLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfSx6czpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLm9zKCEwKTsKdmFyIGI9dGhpcy5jb25mLGM9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwb3N0cm9sbEFkVGFnIikmJihjPXRoaXMudGEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5hZihjKSk/dGhpcy5iYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOih0aGlzLnBsYXllci5wbGF5KCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9fSxhZjpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBiPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGI9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShiKX1yZXR1cm4gYX0sVHI6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci50cyh0aGlzLnpzLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmVhKCl9LCRjOmZ1bmN0aW9uKGEpe2YuZWUoIm1pZHJvbGwiKTtpZighdGhpcy5PZil7dGhpcy5PZj0hMDt2YXIgYj10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuYmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuT2Y9ITF9LmJpbmQodGhpcyksMUUzKSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LFNyOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIubnModGhpcy4kYy5iaW5kKHRoaXMpKTt0aGlzLnBsYXllci5OZCgpfSxiOmZ1bmN0aW9uKCl7dGhpcy5BcygpO3RoaXMucGxheWVyLk5kJiZ0aGlzLlNyKCk7dGhpcy5UcigpfSxVcjpmdW5jdGlvbigpe3ZhciBhPVtdO2lmKHRoaXMuY29uZi55aWVsZGxhYil7dGhpcy5jb25mLnlpZWxkbGFiWzBdP2E9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLlZjLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZil7dGhpcy5rdShhLGIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlciwKYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLldjPXRoaXMuVmMubGVuZ3RofSxFcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5XYyYmKGE9ITApO3JldHVybiBhfSxjczpmdW5jdGlvbihhKXt0aGlzLiRmPWE7Zm9yKGE9MDthPHRoaXMuVmMubGVuZ3RoO2ErKyl0aGlzLlZjW2FdWyJmdW5jdGlvbiJdKHRoaXMuSXIuYmluZCh0aGlzKSl9LElyOmZ1bmN0aW9uKGEpe3RoaXMuV2MtLTthJiZ0aGlzLllkLnB1c2goYSk7MD49dGhpcy5XYyYmdGhpcy4kZigpfSxLcTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsYz0wO2M8dGhpcy5ZZC5sZW5ndGg7YysrKWI9dGhpcy5ZZFtjXSxhPWEucmVwbGFjZShiLm1hY3JvLGIucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZGE9Yy5MZ3x8ZGEsUT0hMSxqYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5BaD10aGlzLmFbN107CnRoaXMuWGc9dGhpcy5hWzEwXTt0aGlzLmc9dGhpcy5hWzZdfWMucG49YjtiLnByb3RvdHlwZT17emg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFoOnRoaXMuV2coYSl9LFdnOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5YZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIEdjPWMucG58fEdjLHZkPW5ldyBHYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnpoKDQpfSkuY2FsbChWb3B1V3VpdlhhaExpb1llLFZvcHVXdWl2WGFoTGlvWWUpOwo=
Protocol
HTTP/1.1
Server
88.198.8.169 Nürnberg, Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.88-198-8-169.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
480f7a2020234eb7d1f5745fbc8ec7f6535905cdeddda4a8b5d63bf6466c33c5

Request headers

Referer
http://www.chip.de/downloads/c1_downloads_hs_getfile_v1_16104869.html?t=1531339545&v=3600&s=9972517a3d42e3a8d71b095907f5a12b
Origin
http://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
Wed, 11 Jul 2018 20:06:01 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
http://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
fdm38inst.exe
dl.cdn.chip.de/downloads/842738/ Frame 127B
0
0

Failed requests

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

Domain
dl.cdn.chip.de
URL
http://dl.cdn.chip.de/downloads/842738/fdm38inst.exe?cid=54396726&platform=chip&1531339259-1531346759-8ca131-B-76f1ecf8d500b85bb110dc9875ee3236.exe

Verdicts & Comments Add Verdict or Comment

180 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 object| _satellite object| queue number| rand function| writeCookie function| readCookie undefined| _sp_ undefined| script undefined| parentElem object| amznpassback function| amzn_ads object| amznads function| aax_write function| amznMatchCookie function| aax_render_ad object| cdivw 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 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 undefined| tfss_towerbanner object| style object| TFMDFP function| getContentHeight function| stickyLooper function| stickySkyscraper object| AdSystemLoader object| googletag boolean| passiveEventSupport object| permutive string| version boolean| hasFEA string| playerCSS string| previewCSS string| currentPlayerCode function| webpackJsonp object| $scriptQueue boolean| cssLoaded boolean| previewCssLoaded function| returnToHomeAuto function| video_completed_action number| addTimeout string| adtech_dl_url function| returnToHome function| dlbutton_rprot function| Cxo_Adtech_Getfile_createIFrame object| iframeToHead boolean| dlbutton_isClicked function| dlbutton_onclick number| timestamp_burn object| google_js_reporting_queue object| google_ad_modifications boolean| google_measure_js_timing object| googleToken object| googleIMState function| processGoogleToken object| adsbygoogle boolean| TFM_adEngineHasRun object| TFM function| jsonpCallback function| $ function| jQuery function| _ string| key string| videoNameString object| _satelliteQ object| _aeq function| generateInfolayer object| dmc_bd5739235da857f function| k function| m number| p function| n function| q function| r function| t function| dm_conative_prebid function| defineCallback object| LUX 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 string| cxops object| cdltq function| scrollListener number| LUX_t_start number| LUX_t_end object| _EQLService object| _EQPScript 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| vttjs function| WebVTT function| videojs object| f function| VideoPlayer object| _EQPService object| _emqYL object| _emqConImpact string| ada_publisher object| _adrtx object| _emqAdexGif object| VopuWuivXahLioYe boolean| v object| Bu object| Cu function| videopkgInterface object| players object| videoScrollspy string| publisherCMSVideoID 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_291439 object| google_persistent_state_async number| google_global_correlator object| closure_lm_378965 string| hic_qos

18 Cookies

Domain/Path Name / Value
a.bf-tools.net/ Name: burdaForward_oil_data
Value: {%22power_opt_in%22:true%2C%22timestamp%22:1531339560561%2C%22version%22:%221.1.33-BF-RELEASE%22%2C%22localeVariantName%22:%22bf%22%2C%22localeVariantVersion%22:%22unknown%22%2C%22privacy%22:{%221%22:true%2C%222%22:true%2C%223%22:true%2C%224%22:true%2C%225%22:true}}
.chip.de/ Name: s_ppv
Value: ir-842738%2520%257C%2520free%2520download%2520manager%2520%255Bdownloads%2520%253E%2520internet%252C%2520o%255D%2C73%2C73%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
www.chip.de/ Name: adp_segs
Value: e0
.chip.de/ Name: s_vi
Value: [CS]v1|2DA331940531279C-40000115A00030F8[CE]
.chip.de/ Name: s_ppvl
Value: ir-842738%2520%257C%2520free%2520download%2520manager%2520%255Bdownloads%2520%253E%2520internet%252C%2520o%255D%2C73%2C73%2C1200%2C1600%2C1200%2C1600%2C1200%2C1%2CP
.chip.de/ Name: s_invisit
Value: true
.chip.de/ Name: s_vnum
Value: 1562875560721%26vn%3D1
.chip.de/ Name: s_fid
Value: 4B2E1005E6042E97-0A140D46E7750D68
.chip.de/ Name: gpv
Value: ir-842738%20%7C%20free%20download%20manager%20%5Bdownloads%20%3E%20internet%2C%20o%5D
www.chip.de/ Name: oil_data
Value: {%22opt_in%22:true%2C%22timestamp%22:1531339560521%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.de/ Name: s_lastvisit
Value: 1531339560733
www.chip.de/ Name: lux_uid
Value: 153133956075174507
www.chip.de/ Name: POPUPCHECK
Value: 1531425960447
.chip.de/ Name: CXOid
Value: 0.6416991872606892
.chip.de/ Name: s_cc
Value: true
www.chip.de/ Name: chip_session
Value: 1
www.chip.de/ Name: AB_countNew
Value: first
www.chip.de/ Name: AB_SegmentNew
Value: sourcepoint

3 Console Messages

Source Level URL
Text
console-api log URL: http://adtm.chip.de/3469f5db1bb7fc021f6829a881d1c8a6df48a471/satelliteLib-1f360a6db91f2db811a8431bff692897ac6cf408.js(Line 4)
Message:
oil_shown_adobe
console-api info URL: http://cdn.conative.de/artifacts-v2/ab14227678c3837a0815482cc7555951861a5811/adscript.min.js(Line 102)
Message:
conative received prebid request for adSlotId 0
console-api warning URL: https://filestorage.chip.de/videoplayer/videoplayer.db4b874c686da775482d.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
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
dl.cdn.chip.de
dsp.adfarm1.adition.com
dyn.emetriq.de
filestorage.chip.de
hgc-cf-cache-1.svonm.com
imasdk.googleapis.com
irqs.ioam.de
omniture.chip.de
p.yieldlab.net
pagead2.googlesyndication.com
partners.wfxtriggers.com
r.chip.de
rt.chip.de
s0.2mdn.net
script.ioam.de
securepubads.g.doubleclick.net
ssl.1.damoh.chip.de
ups.xplosion.de
videoembed.chip.de
videos.chip.de
www.chip.de
www.googletagservices.com
xpl.theadex.com
dl.cdn.chip.de
172.82.228.19
176.9.3.108
193.46.63.75
2001:16e0:10a:1::c1:1
2001:16e0:10a:1::c2:1
216.58.214.102
216.58.214.98
23.111.9.35
2600:9000:2006:f600:1c:8c89:a300:93a1
2a00:1450:4001:806::2002
2a00:1450:4001:80b::2002
2a00:1450:4001:812::200a
2a00:1450:4001:815::2002
2a00:1450:4001:816::2006
2a02:26f0:6c00:192::bf0
2a02:26f0:6c00:194::1142
2a02:26f0:6c00:195::1142
2a02:26f0:6c00:197::bf0
2a02:26f0:6c00:28b::30fb
2a02:26f0:6c00:28c::bf0
2a02:26f0:6c00:292::30fb
2a02:26f0:6c00:2bc::bf0
2a02:26f0:eb:193::bf0
2a02:26f0:eb:1a1::bf0
34.249.170.42
46.137.113.194
52.17.80.93
52.212.57.107
52.215.33.234
52.85.177.41
52.94.218.7
54.192.47.63
54.230.44.222
54.230.44.74
54.77.222.97
85.114.144.107
85.114.144.195
85.114.159.118
88.198.8.169
91.215.100.39
91.215.103.64
91.215.103.65
0051671131359ffdcaa608831243bf98643cfd19d30933e878fd62f300833ba9
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
0ddda9839c0f03c7cc800154368af8a65eeef1ad60c70559fa784d30f21b1165
13d01a91a2551b2330cd623855b2adcda9f371d720eb02ef3adcf3a5dbffcf6a
18cde97d17724751dd2b50466e464b5c4a2fd608c30fd11969830956b3383f75
1bfb94c4c4ed58fa8d0c81006a568c3f4d7efc4c453c58b11115ad6cf57d8e87
1c80619aa99b4bce0b57edaeaf2bae35ad0e1929096a51d0ced52df4dfa68e3d
23507a32a6b00da4bba440d963fbcae1a035a191cff622985da4237a7b0ce311
27f63f7730a4d8a7b430e3ebce56d29b14471a6b75b432b202d80df03d6550b8
2ac0bda221cfdc311f691f5b9fa2729efdfdb485f16e54f8089c3fc3ef50d354
2e7c3de3b7b139a02ba310ff114665caa7c9716a26b3d7afa247466ea4c9a064
304277d7a57f9003694a84e0afdaf94f35f061aece3dc8cac37bf2ad87244bb3
31b96de7507628a225f4a7aaf348b4d9e4d10a73d8e00be9a98586557fe25505
349a658bfe8ec9c807d02d46bddd2a2a6b4e36a5c2705e3e8706db2fac2bb18c
3830c3036c21cb4580425ba8522a8144d6d58e7382cd85a02198c219ccb29250
3bebdf1209be7a7165753ad5d4a1120676205bb8c8c7b23ebe33982a7219c183
3cabd46479e9888c9a0f23d2450ac1593b8176311b0468127feb546e5823adbd
4498abc4b0327f866180100b14c14d0644ef12db41852db4be4bcf5ac54d732a
480f7a2020234eb7d1f5745fbc8ec7f6535905cdeddda4a8b5d63bf6466c33c5
4ac5a62a981d4ab42f91f176710b8c77c7f26bdb3c9dc115466481308aebd89f
4d643ab234c70d43e4bb9887222ad5caf63460ddbd41e0aeb5479f33a01213b8
4f174e98a1a9fbb4cb9773e99b07f5faf81af3059cc8be88eec0392cefdfc986
5561f6573bec8167d4b73eb0952116e250cce1c2e0cfd3889ddd934352783d1d
5967eecd6a5178f8afc63fdfdfc6ff0d57196bfeedbafd1615bf53c66dcacf57
59eef289b63cafa1d3889e072a1cfefa5f7bf785b525eabcf3aef0002cb5533a
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
62f86efbbf362718d8b5cdd6c4a3fd7261f9512e383359286c0da5355c0c503f
63014e0db08db9a1ba9a35d531d3ccefa158e33f53f436142550ef0d0acd5b5f
681ab2e31f80632bba4a8d51c9722044a538f9dbb7b0c1279edb93cdce24d350
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6ddeaf79d1911c57d0bcb260fda9f7552f4ffa7cdc77e706ef45a5132178b2f5
6f43ff79d7db2ff36aa5506ec682550d6442a0aac4d7babadac4aefe81afc1bf
74dba0e1a89c34d627f31a3107e62a8f8b69a47789798b47a5ef90570c8dc324
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76be94d03db6a2d007e27e284126aa139ec510be48d7e090bc4120c270d9fc1c
7a224acf8e699b4d3a541efa56217266b179d647b49c09d08cd4d47cc64db713
8204e994764cb94b0f57f40de12cc41c802694a290b04373af15d33624a75e39
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
872a89b71125b119ae4d455f15ca37c270a0702070ea4a9b10af70022210d2a7
897146e630e07325a5205de579fa04b4f650b148bab1740694f8fc28e422d14b
8eecf0a2944ad09c2017e2351de3edd35017eb94e1f3f412e4c942701f9f0687
92720b5b049592c4b1f1fe1f64762c10a2eb863df4ad4d934ea1826807b43cc6
96462e773b00c01a79cd885a78e923ea67fe8765c6d1ba38410133b222b34c71
9691f3a40c39e598978142c51126ea22f3b7667635c2644e79b662914d270560
96a277140a07c8bfdbf6926bd41c2b1b9915e266760ad9f34f26069ec9cb8c2a
997b4337cdc0a396bb1b924e865a16fa877fad1f69a72149ddc64073f35d6081
9c3a8a4dcb7025502bbad37ed9eda1f0a4310c7f19d3effc381483f6f18095f5
9ce0815e04e67d2dde584322db795c23301b0794797fbcd84210d49bc89ad28a
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9ed3a2ae1ef227fdc6f09c78bcc9a1e590da910c1c276f96b2aaf86d6c4a952e
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a1ecbaed793a1f564c49c671f2dd0ce36f858534ef6d26b55783a06b884cc506
a6a1913cb604f6626586e00b44f3d5a9efd6929752a59b87366d5f0ca70d39e4
ac9f2e62bf488a3f18038b7ba3526884daf4e231bc5d332f4b316934e9c16f4e
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b001be44e53a0b5c52327701170e75b18b032edb0062402e1d43cc9772633b3e
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b3e55d92da4bcf79b3c673a5b27d327436ccb46a2ee5276e2a5aaf4dbe8e1550
b54ab16ff88abc1bc88e4da361475774d508f7be32a7ae8b3e7acdf34ad7445e
c927695a6166edbfb66984db84b2913dcc6da4c9af0c0072dfd3807e660cd5b6
cb424a134d34f0055e4a9be86847cc0d6dec3aab0498b8f276d5ee68b737d7c3
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d273db0f662ed916c6c6302d817a0e2a17eafe6080b0ff239a03e307dde17f8a
de061a6515a35f573d3694f7b34f81f511f51e145b89919cc421ca088e49bd55
e0372503b783afd44c634d8aa10fb5616a05494e3402306cc7eb8f64aa6325b6
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e832be11265d7211c4d6a39727d1f1dc0deb7225138ac6bb9627df33446b8477
ec13ba8196cd9c9400ad864553c2578fbd47eda5d52cb59e3760a769babbafeb
ed5acbd32a88f9959e4fa56ccc47da61ce54c15299422c1204518222ea35db6e
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
fa4b1286d83c2724401fe389061ba97f8d54777a020bce051d2a66ad90c6b5d4